Вы можете сделать это, но вам потребуется отмывание памяти для этого, если у вас есть ссылочные или константные члены, или если тип класса меняется.
Учтите это:
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
}
Теперь это хорошая идея? Я бы посоветовал против этого, так как это может привести к путанице, но это можно сделать безопасно.