将const引用返回给临时对象的成员

时间:2015-10-17 11:29:36

标签: c++ c++11 temporary-objects

返回对临时对象成员的const引用时会发生什么?该对象的生命周期是多少;

E.g。

struct temp
{
  T m_mine;

  static temp make()
  {
    return temp();
  }
};

T const & foo()
{
  return temp::make().m_mine;
}

c ++ 98和c ++ 11的行为是什么?

2 个答案:

答案 0 :(得分:2)

在这种情况下,对象或裁判类型的常量无关紧要:它只是返回对当时不再存在的对象的引用。然后使用引用是Undefined Behavior。

同样,如果将对const的成员引用绑定到对象,则不会延长裁判的生命。

对象生存期扩展仅适用于将本地引用绑定到对象的情况,仅适用于引用const对象或右值引用的情况。

我写这篇文章时的示例代码有几个问题。请仅发布真实代码(尽可能)。它应该粘贴,而不是重新输入。

(另外,由于现在至少有2个答案涉及代码的问题,因此在不改变答案的上下文并因此使它们无效的情况下纠正它为时已晚。所以重要的是得到它代码在原始帖子中是正确的。值得记住下一个SO问题。)

答案 1 :(得分:0)

在多个帐户中,您的代码在编译之前是不正确的:

  • 类型声明
  • 后至少缺少分号
  • 代码使用非static成员make(),就好像它是static函数一样

一旦克服了这一点:返回的引用引用了一个对象的子对象,该对象在执行return语句之后以及任何可以获取它之前被销毁。也就是说,有一个陈旧的参考回报。对此引用的任何访问都将导致未定义的行为。如果运气好的话,程序会在此时崩溃。如果你运气不好,它会做你喜欢的事情。例如,它可能“工作”,直到程序被证明给客户或投资者,此时它可能决定反对显示侮辱。