新しい(this)ThisClass()は悪い考えですか?


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

私はこのイディオムを見たことがなく、本当に微妙で厄介なように見えるかもしれませんが、(FooView最終的なものである限り)実際に問題を考えることはできません。これは悪い考えですか?


related / dupe:stackoverflow.com/questions/58274963/…。タイプの完全なコンテキストを取得できますか?それは問題である。
NathanOliver

回答:


12

それは可能ですが、参照または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
}

今それは良い考えですか?混乱を招く可能性がありますが、安全に実行できるため、これはお勧めしません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.