通常,此讨论仅取决于本地函数变量:
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
?
答案 0 :(得分:3)
C ++ 03标准(第12.2 / 5节“临时对象”)恰当地回答了您的问题:
引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内持续存在,除非下面指定。 构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出。函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止。
答案 1 :(得分: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文章似乎在讨论编译器延长引用所指向的对象的生命周期。再次,引用本身只是一个指针。