我通过两个对象生命周期放置了一个局部变量:
class Thing
{
int i;
public:
Thing() : i(44) {}
~Thing() { i = 0; }
void set(int i) { this->i = i; }
void report() const { std::cout << i << std::endl; }
};
...
Thing thing;
thing.report();
thing.set(72);
thing.report();
thing.~Thing();
new (&thing) Thing();
thing.report();
thing.set(97);
thing.report();
thing.~Thing();
thing.report();
我暂时希望打印以下内容:
44
72
44
97
0
确实如此。
但这段代码能保证这样吗?或者是否会调用未定义的行为或某些此类行为? (我特别怀疑上一次report()
电话;我只是出于好奇而抛出那个。)
如果事物是成员,那该怎么办:
struct Owner
{
Thing thing;
void go()
{
thing.report();
thing.~Thing();
new (&thing) Thing();
thing.report();
}
};
...
Owner owner;
owner.go();
Owner().go();
这似乎对我有用。应该吗?
(是的,我知道这种技术在各方面都很危险。我不是要问或说出是否有人应该使用它。我只是想知道它是否真的被允许标准,而不仅仅是我当前的编译器设置所允许的。)