Apakah baru (ini) ThisClass () ide yang buruk?

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

Saya belum pernah melihat idiom ini, dan sepertinya itu bisa sangat halus dan berantakan, tetapi saya tidak dapat benar-benar memikirkan masalah dengan itu (selama FooViewfinal). Apakah ini ide yang buruk?

luqui
sumber
related / dupe: stackoverflow.com/questions/58274963/… . Bisakah kita mendapatkan konteks penuh dari tipe ini? Bermasalah.
NathanOliver

Jawaban:

12

Anda dapat melakukannya, tetapi Anda akan memerlukan pencucian memori untuk itu jika Anda memiliki anggota referensi atau konst, atau jika jenis kelas berubah.

Pertimbangkan ini:

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?
}

Untuk menghindari perilaku tidak terdefinisi ini, Anda harus mencuci memori menggunakan std::launder. Kompilator akan menganggap bahwa masa hidup fvtidak akan terpengaruh oleh apa pun kecuali }. Pencucian akan membuat kompiler menganggap ada objek, tidak terkait dengan fv:

int main() {
    FooView fv{9};

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

Sekarang apakah itu ide yang bagus? Saya menyarankan agar hal itu tidak membingungkan, tetapi bisa dilakukan dengan aman.

Guillaume Racicot
sumber