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 fv
tidak 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.