【问题标题】:Is the lvalue reference return of a member function of a temporary object a dangling reference?临时对象的成员函数的左值引用返回是悬空引用吗?
【发布时间】:2014-11-19 04:15:36
【问题描述】:

有一个班级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 文档在哪里描述了这些行为?还是我错了?

【问题讨论】:

  • 当然它不会在编译时发出警告/错误。它不知道Create() 在运行时调用时会返回对*this 的引用。

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


【解决方案1】:

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

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

【讨论】:

  • 问题:如果我们改用const CBase &kk = CBase().Create(); - const 会在这里改变什么吗?还是悬空引用还是kk的生命现在被延长了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 2018-05-25
相关资源
最近更新 更多