Answers:
您可以这样做,但是如果您具有引用或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
}
现在是个好主意吗?我建议您不要这样做,因为它可能导致混乱,但是可以安全地进行。