左值引用返回临时对象的成员函数的悬空引用吗?

时间:2014-11-19 04:15:36

标签: c++ temporary-objects dangling-pointer

有一个班级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文档描述这些行为的位置吗?或者我错了吗?

1 个答案:

答案 0 :(得分:3)

是的,kk是一个悬空参考,而pp是一个悬空指针。由CBase()生成的临时表仅在其出现的完整表达式的持续时间内存在。请注意,指针或引用引用此对象仍然有效,只要它们的生命周期也绑定到表达式。

由于kkpp在完整表达后仍然存在,因此情况并非如此。使用kk和解除引用pp具有未定义的行为。