临时对象的成员函数的左值引用返回是否为悬空引用

Is the lvalue reference return of a member function of a temporary object a dangling reference?

本文关键字:引用 是否 返回 成员 函数 临时对象      更新时间:2023-10-16

有一个类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()生成的临时仅在它出现的完整表达式的持续时间内存在。请注意,让指针或引用引用此对象仍然有效,只要它们的生存期也绑定到表达式。

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