有一个CBase类。

class CBase
{
    ...
    CBase &Create()
    {
        return *this;
    }
    ...
}

如果我声明一个左值引用和一个指针,
CBase &kk = CBase().Create();
CBase *pp = &( CBase().Create() );
kk是一个悬挂的引用,并且pp是一个悬挂的指针吗?

我认为kkpp晃来晃去。因为毫无疑问,调用CBase()会创建一个临时对象,所以派生词CBase().Create()也应该如此。但是,Xcode(6.1版)没有给出警告或错误消息。

谁能给我一些提示或告诉我C++ 11文档在哪里描述了这些行为?还是我错了?

最佳答案

是的,kk是一个悬空引用,pp是一个悬空指针。 CBase()产生的临时内容仅在出现它的完整表达式期间存在。请注意,只要指针或引用的寿命也绑定(bind)到表达式,则仍然有效。

由于在完整表达式之后kkpp仍然存在,所以不是这种情况。使用kk和取消引用pp具有未定义的行为。

08-27 07:45