の合法性と同様に、へのdelete this
新しい配置this
も私の知る限り許可されます。また、、this
または他の既存のポインタ/参照を後で使用できるかどうかに関して、いくつかの制限があります:
[basic.life]
オブジェクトの存続期間が終了した後、オブジェクトが占有していたストレージが再利用または解放される前に、元のオブジェクトが占有していたストレージの場所に新しいオブジェクトが作成された場合、元のオブジェクトを指すポインター、参照元のオブジェクトを参照した場合、または元のオブジェクトの名前が自動的に新しいオブジェクトを参照し、新しいオブジェクトの存続期間が開始すると、次の場合に新しいオブジェクトを操作できます。
- 新しいオブジェクトのストレージは、元のオブジェクトが占めていたストレージロケーションを正確にオーバーレイします。
- 新しいオブジェクトは元のオブジェクトと同じタイプです(トップレベルのcv-qualifiersは無視されます)。
- 元のオブジェクトの型がconst修飾されておらず、クラス型の場合、型がconst修飾型または参照型の非静的データメンバーを含んでいない。
- 元のオブジェクトも新しいオブジェクトも、重複する可能性のあるサブオブジェクト([intro.object])ではありません。
この例では最初の2つは満たされていますが、最後の2つを考慮する必要があります。
3番目の点に関しては、関数が非const修飾されている場合、元のオブジェクトが非constであると想定することはかなり安全です。誠実さが捨てられた場合、障害は呼び出し側にあります。const / referenceメンバーについては、これが割り当て可能であると主張することで確認できると思います。
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
もちろん、割り当て可能性が要件であるため、代わりに*this = {};
、同じプログラムを作成することを期待しているものを単に使用することもできます。おそらくもっと興味深いユースケースは*this
、別のタイプのオブジェクトのためにのメモリを再利用することかもしれません(this
少なくとも再解釈+ロンダリングなしでは、を使用するための要件に失敗します)。
と同様にdelete this
、への新しい配置this
は、「安全」とは言えません。