C 98 では、コンパイラはメンバーごとのコピーを通じてコピー コンストラクターとコピー代入演算子を自動的に作成できました。このプロセスは、移動セマンティクスの導入により C 11 まで拡張されました。ただし、移動操作の自動生成のルールは、コピー操作のルールとは異なります。
Howard Hinnant の ACCU 2014 プレゼンテーションでは、これらのルールの簡潔な概要が説明されています。次の表は重要なポイントをまとめたものです:
</p> <table> <thead><tr> <th> </th> <th>Destructor</th> <th>Move Constructor</th> <th>Move Assignment Operator</th> </tr></thead> <tbody> <tr> <td>C 98/03</td> <td>No</td> <td>Yes</td> <td>Yes</td> </tr> <tr> <td>C 11 (Defect Report 1492)</td> <td>Yes</td> <td>No</td> <td>No</td> </tr> <tr> <td>C 11 Final</td> <td>Yes</td> <td>Yes<sup>*</sup> </td> <td>Yes<sup>*</sup> </td> </tr> </tbody> </table> <p>
はい: 自動的に生成されます。
いいえ: 自動的には行われません
*ただし、暗黙的に定義されているだけです (宣言されていない、または宣言済み=デフォルト)。明示的な定義は生成を抑制します。
これらのルールは、移動コンストラクターと移動代入演算子は通常、C 11 で自動的に生成されますが、生成されない場合があることを示しています。たとえば、デストラクターが明示的に定義されている場合、移動操作は生成されません。同様に、移動操作自体を明示的に定義すると、自動生成が抑制されます。
以上が自動移動操作生成ルールは C 98 と C 11 でどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。