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?


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.