【发布时间】:2011-12-09 19:48:03
【问题描述】:
考虑以下代码:
#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 对此事有何评论?
【问题讨论】:
-
我一直不明白这类问题的主要目标是什么。您只需阅读 c++ 参考。另外,您在实际项目中使用这种结构的频率如何?
-
希望永远不会!大声笑 - 那将是一个破碎的设计。 ;)
标签: c++