class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
我从未见过这种习语,而且看起来确实很微妙和凌乱,但是我真的想不出它有什么问题(只要
FooView
是最终的)。这是一个坏主意吗? 最佳答案
您可以执行此操作,但是如果您具有引用或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
}
现在是个好主意吗?我建议您不要这样做,因为它可能导致困惑,但是可以安全地进行。
关于c++ - 新的(this)ThisClass()是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59689292/