class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
Eu nunca vi esse idioma e parece que pode ser realmente sutil e confuso, mas não consigo pensar em um problema com ele (desde que FooView
seja final). Isso é uma má ideia?
c++
placement-new
luqui
fonte
fonte
Respostas:
Você pode fazer isso, mas precisará de lavagem de memória para isso se tiver membros de referência ou const, ou se o tipo da classe for alterado.
Considere isto:
Para evitar esse comportamento indefinido, você deve lavar a memória usando
std::launder
. O compilador assumirá que o tempo de vida útilfv
não será afetado por nada, exceto}
. A lavagem fará o compilador assumir que há um objeto, não relacionado afv
:Agora é uma boa ideia? Eu desaconselho, pois isso pode causar confusão, mas pode ser feito com segurança.
fonte