Bạn có thể làm điều đó, nhưng bạn sẽ cần rửa bộ nhớ cho điều đó nếu bạn có thành viên tham chiếu hoặc const, hoặc nếu loại lớp thay đổi.
Xem xét điều này:
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?
}
Để tránh hành vi không xác định này, bạn nên rửa bộ nhớ bằng cách sử dụng std::launder
. Trình biên dịch sẽ cho rằng thời gian tồn tại fv
sẽ không bị ảnh hưởng bởi bất cứ điều gì ngoại trừ }
. Rửa sẽ làm cho trình biên dịch giả định có một đối tượng, không liên quan đến fv
:
int main() {
FooView fv{9};
std::cout << fv.val; // surely 9!
fv.refresh();
std::cout << std::launder(&fv)->val; // yay, 5
}
Bây giờ nó là một ý tưởng tốt? Tôi khuyên bạn nên chống lại nó vì nó có thể dẫn đến nhầm lẫn nhưng nó có thể được thực hiện một cách an toàn.