class FooView final : public Something
{
    ...
    void refresh()
    {
        this->~FooView();
        new (this) FooView();
    }
}

我从未见过这种习语,而且看起来确实很微妙和凌乱,但是我真的想不出它有什么问题(只要FooView是最终的)。这是一个坏主意吗?

最佳答案

您可以执行此操作,但是如果您具有引用或const成员,或者类的类型发生更改,则需要进行内存清洗。

考虑一下:

struct FooView {
    const int val;

    void refresh()
    {
        this->~FooView();
        new (this) FooView{5};
    }
}

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << fv.val; // hmm... val is a const object, so it's 9 still?
}

为了避免这种不确定的行为,您应该使用 std::launder 清洗内存。编译器将假定fv的生存期不受}之外的任何其他因素的影响。洗涤将使编译器假定存在一个与fv不相关的对象:
int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << std::launder(&fv)->val; // yay, 5
}

现在是个好主意吗?我建议您不要这样做,因为它可能导致困惑,但是可以安全地进行。

关于c++ - 新的(this)ThisClass()是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59689292/

10-13 03:33