此对象是否通过显式构造函数和析构函数调用在技术上正确重新初始化?

时间:2016-03-10 04:13:06

标签: c++ constructor destructor

我通过两个对象生命周期放置了一个局部变量:

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();

这似乎对我有用。应该吗?

(是的,我知道这种技术在各方面都很危险。我不是要问或说出是否有人应该使用它。我只是想知道它是否真的被允许标准,而不仅仅是我当前的编译器设置所允许的。)

0 个答案:

没有答案