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

returning const reference to a member of a temporary object

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

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

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

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

对象或裁判类型的连续性在此上下文中无关紧要:它只是返回对当时已不存在的对象的引用。使用引用则是未定义行为。

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

对象生命周期扩展仅适用于将局部引用绑定到对象的情况,并且仅适用于引用const对象或右值引用的情况。


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

(另外,由于现在至少有两个答案涉及代码的问题,如果不改变答案的上下文从而使其无效,则纠正它为时已晚。因此,在原始发布中获得正确的代码非常重要。

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

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

一旦解决了这个问题:返回的引用指向一个对象的子对象,该对象在return语句执行之后,在任何东西可以控制它之前被销毁。也就是说,有一个过时的引用返回。对该引用的任何访问都将导致未定义的行为。如果幸运的话,程序此时会崩溃。如果你运气不好,它会发生你希望发生的事情。例如,在向客户或投资者演示程序之前,它可能会"工作",此时它可能会决定宁愿显示侮辱。