考虑以下代码:
#include <iostream>
struct A {
const char *name;
A() : name("A") {
std::cout << "A()\n";
}
virtual ~A() {
std::cout << "~A()\n";
}
};
class B {
const A& a;
public:
B() : a(A()) {
};
void print_data() const {
std::cout << a.name << '\n';
}
~B() {
std::cout << "~B()\n";
}
};
int main() {
B b;
b.print_data();
return 0;
}
GCC 4.4 的输出是:
A() ~A() A ~B()
这对我来说看起来很奇怪。我本来期望 A 的临时实例的副本绑定到 B::a 或者该临时实例本身在 ~B() 期间被破坏。
基本上,我认为 B::a 在 b 的生命周期中始终是有效的引用。事实上 b.print_data() 显然可以工作并且编译器不会给出任何警告。
标准c++98/03对于这个问题是怎么说的呢?
持续的引用并不能延长课堂上临时人员的寿命。就是这样。他们只在Foo const& f = Foo();
where foo
按值返回,但仅此而已。
§12.2 [class.temporary]
p4 有两种上下文,其中临时变量在与完整表达式末尾不同的点被销毁。 [...]
p5 第二个上下文是当引用绑定到临时对象时。引用所绑定的临时对象或临时对象(临时对象所绑定的子对象的完整对象)在引用的生命周期内持续存在,除非下面指定。构造函数构造函数初始化程序 (12.6.2) 中引用成员的临时绑定将持续存在,直到构造函数退出.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)