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

时间:2011-07-16 04:40:36

标签: c++ lifetime class-members const-reference

通常,此讨论仅取决于本地函数变量:

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);
}

全部3 a的整个生命周期中 <{strong> new 内容是否保持相同已分配A

2 个答案:

答案 0 :(得分:3)

C ++ 03标准(第12.2 / 5节“临时对象”)恰当地回答了您的问题:

引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内持续存在,除非下面指定。 构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出。函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止。

答案 1 :(得分: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对象的生命周期跨越多个函数,答案就更明显了。

旁注:我发现“内容”这个词有点含糊不清。使用指针等同引用,因此a基本上指向一个整数。 const或不,如果整数不再存在(因为它在堆栈上并且已被删除),你的a - 虽然仍然指向内存中的相同地址 - 现在引用其他东西。 GotW文章似乎在讨论编译器延长引用所指向的对象的生命周期。再次,引用本身只是一个指针。