有一个CBase
类。
class CBase
{
...
CBase &Create()
{
return *this;
}
...
}
如果我声明一个左值引用和一个指针,
CBase &kk = CBase().Create();
CBase *pp = &( CBase().Create() );
kk
是一个悬挂的引用,并且pp
是一个悬挂的指针吗?我认为
kk
和pp
晃来晃去。因为毫无疑问,调用CBase()
会创建一个临时对象,所以派生词CBase().Create()
也应该如此。但是,Xcode(6.1版)没有给出警告或错误消息。谁能给我一些提示或告诉我C++ 11文档在哪里描述了这些行为?还是我错了?
最佳答案
是的,kk
是一个悬空引用,pp
是一个悬空指针。 CBase()
产生的临时内容仅在出现它的完整表达式期间存在。请注意,只要指针或引用的寿命也绑定(bind)到表达式,则仍然有效。
由于在完整表达式之后kk
和pp
仍然存在,所以不是这种情况。使用kk
和取消引用pp
具有未定义的行为。