const引用右值的类数据成员的生命周期是多少?

What is the lifetime of the class data member which const reference to a rvalue?

本文关键字:周期 多少 生命 引用 const 数据成员      更新时间:2023-10-16

一般来说,这个讨论只取决于局部函数变量:

void foo (const int &i)
{
  // use i till foo() ends
}
foo(3);

但是,这个规则也适用于class成员吗?

struct A {
  const int &a;
  A () : a(3) {}  // version 1
  A (const int &i) : a(i) {} // version 2
};

现在A用作,

{
  return ()? new A : new A(3) : new A(some_local_variable);
}

a 内容在所有3 new分配的A的生命周期内是否保持不变?

c++ 03标准(章节"12.2/5临时对象")恰当地回答了你的问题:

引用所绑定的临时对象或作为临时对象所绑定的子对象的完整对象的临时对象在引用的整个生命周期内持续存在,下面指定的情况除外。在构造函数的参数初始化式(12.6.2)中,与引用成员的临时绑定一直持续到构造函数退出为止。

在函数调用(5.2.2)中,对引用形参的临时绑定一直持续到包含该调用的完整表达式完成为止。

如果您使用new分配对象,它将永远保留在内存中-直到您delete它。它不是一个临时对象。

aA的成员,也是分配的一部分。

编辑:谢谢你的评论。我会说,不,这是不对的。想想看:
struct A {
  const int &a;
  A () : a(3) {}  // version 1
  A (const int &i) : a(i) {} // version 2
};
void foo() {
  A *pA;
  {
     int x;
     pA = new A(x);
  }
  // Now pA->a is pointing to the address where `x` used to be,
  // but the compiler may very well put something else in this place now
  // because x is out of scope.
}

如果A对象的生命周期跨越多个函数,答案就更明显了。

旁注:我发现"contents"这个词在这里有点模棱两可。将引用等同于指针,因此您的a基本上指向一个整数。无论是否为const,如果该整数不再存在(因为它在堆栈上并且已被删除),则您的a -虽然仍然指向内存中的相同地址-现在正在引用其他内容。GotW的文章似乎在讨论编译器延长引用所指向的对象的生命周期。引用本身也是一个指针。