4

通常,此讨论仅取决于局部函数变量:

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 ly 分配的生命周期中,内容是否会 保持a 不变 newA

4

2 回答 2

3

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

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

于 2011-07-16T05:06:15.800 回答
2

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

a是 的成员A,并且是分配的一部分。

编辑:感谢您的评论。我会说 - 不,这是不正确的。考虑一下:

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 文章似乎在谈论编译器延长引用指向的对象的生命周期。同样,引用本身只是一个指针。

于 2011-07-16T04:44:38.503 回答