カスタマイズされたデストラクタが定義されているときに、暗黙的に定義された移動代入演算子を削除するという C++ 標準委員会の選択の背後にある理論的根拠は何ですか?
2 に答える
Scott MeyerのEffective Modern C++ Item 17から( Rule of Threeの知識があると仮定して):
3 つの規則の結果として、ユーザーが宣言したデストラクタが存在することは、単純なメンバーごとのコピーがクラスのコピー操作に適している可能性が低いことを示しています。これは、クラスがデストラクタを宣言する場合、コピー操作はおそらく自動的に生成されるべきではないことを示唆しています。[...]
ただし、3 つの規則の背後にある推論は依然として有効であり、コピー操作の宣言が移動操作の暗黙的な生成を排除するという観察と相まって、C++11 が次のクラスの移動操作を生成しないという事実を動機付けます。ユーザー宣言のデストラクタ。
デフォルトで生成された構造体 (コピー コンストラクター、コピー割り当て、またはデストラクター) のいずれかの存在は、型が何らかの特別なリソース管理を行う必要があることを示しているという考え方です。その場合、デフォルトの移動操作では正しく動作しない可能性があります。デフォルトで生成されたコピー コンストラクターは正しく動作するが、デフォルトで生成されたムーブ コンストラクターが失敗した実際の失敗例が提示されたかどうかはわかりません。
解決策は、特にそれぞれの移動操作を要求するのは簡単であるため、デフォルトで移動操作を生成しない方が安全であるということでした: 単純に= default
ed 実装を追加します。とにかく、クラスは明らかにすでに何か特別なことを行っています(そうでなければ、デストラクタはありません)。