É `new (this) MyClass ();` comportamento indefinido após chamar diretamente o destruidor?
Emesta questão minha, @DeadMG diz que reinicializando uma classe através dothis
ponteiro é um comportamento indefinido. Existe alguma menção a isso no padrão em algum lugar?
Exemplo
#include <iostream>
class X{
int _i;
public:
X() : _i(0) { std::cout << "X()\n"; }
X(int i) : _i(i) { std::cout << "X(int)\n"; }
~X(){ std::cout << "~X()\n"; }
void foo(){
this->~X();
new (this) X(5);
}
void print_i(){
std::cout << _i << "\n";
}
};
int main(){
X x;
x.foo();
// mock random stack noise
int noise[20];
x.print_i();
}
Exemplo de saída em Ideone (Eu sei que o UB também pode ser "um comportamento aparentemente correto"
Observe que eu não chamei o destruidor fora da classe, para não acessar um objeto cuja vida útil terminou. Observe também que o @DeadMG diz que chamar diretamente o destruidor é bom desde que seja chamado uma vez para cada construto