この私の質問では、@DeadMGは、this
ポインターを介してクラスを再初期化することは未定義の動作であると言います。どこかの規格に言及されていますか?
例:
#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();
}
Ideone での出力例(UB も「一見正しい動作」になる可能性があることはわかっています)。
有効期間が終了したオブジェクトにアクセスしないように、クラスの外部でデストラクタを呼び出さなかったことに注意してください。また、@DeadMG は、コンストラクターごとに 1 回呼び出される限り、デストラクタを直接呼び出すことは問題ないと言っていることに注意してください。