3

特別なメンバー関数に関するウィキペディアの記事には、ムーブコンストラクターとムーブ代入演算子への参照は含まれていません。

エントリを更新したいのですが、0x標準が何を言っているのかわかりません。

これら2つの機能に関するルールは何ですか?それらはコンパイラーによって自動的に生成されますか?もしそうならいつですか?


編集:ウィキペディアのページを更新しました。誰かがそれを感じたら、それを形に編集してコミュニティを助けてください(必要な場合)。

4

1 に答える 1

3

C ++ 0xはまだ標準ではないことに注意してください。これは、変更される可能性があります。FCD (PDFリンク)から、ムーブコンストラクターとムーブ代入演算子を明示的にデフォルト設定でき、暗黙的にデフォルト設定することもできます。*****


一瞥するのに役立つかもしれないたくさんのものを引用します(大幅に要約します):

明示的にデフォルト設定された関数については、§8.4.2/ 1-2:

明示的にデフォルト設定されている関数は、

  • 特別なメンバー機能であり、
  • 暗黙的に宣言された場合と同じ宣言された関数型を持ち、
  • デフォルトの引数がなく、
  • 例外仕様はありません。

最初の宣言で明示的にデフォルトになっている場合、

  • それは公開されなければならない、
  • 明示的であってはならない、
  • それは仮想であってはならない、
  • 暗黙的に宣言された場合と同じ例外仕様を持つと暗黙的に見なされ(15.4)、
  • コピーコンストラクター、ムーブコンストラクター、コピー代入演算子、またはムーブ代入演算子の場合は、暗黙的に宣言されている場合と同じパラメーター型である必要があります。

特別なメンバー関数については、§12/ 1:

デフォルトのコンストラクター(12.1)、コピーコンストラクターとコピー代入演算子(12.8)、ムーブコンストラクターとムーブ代入演算子(12.8)、およびデストラクタ(12.4)は特別なメンバー関数です。[注:プログラムが明示的に宣言していない場合、実装は一部のクラスタイプに対してこれらのメンバー関数を暗黙的に宣言します。それらが使用される場合、実装はそれらを暗黙的に定義します。12.1、12.4、および12.8を参照してください。—エンドノート]

暗黙的に宣言された関数について、§12.8/ 8-11:

クラス定義でコピーコンストラクターが明示的に宣言されておらず、ユーザー宣言の移動コンストラクターがない場合、コピーコンストラクターはデフォルトとして暗黙的に宣言されます(8.4)。

クラスXの暗黙的に宣言されたコピーコンストラクタは、次の形式になりますX::X(const X&)

  • Xの各直接または仮想基本クラスBには、最初のパラメーターがタイプconst B&またはconst volatile B&、であるコピーコンストラクターがあります。
  • クラスタイプM(またはその配列)であるXのすべての非静的データメンバーの場合、そのような各クラスタイプには、最初のパラメーターがタイプconst M&または。であるコピーコンストラクターがありますconst volatile M&

それ以外の場合、暗黙的に宣言されたコピーコンストラクタはの形式になりX::X(X&)ます。

クラス定義がmoveコンストラクターを明示的に宣言していない場合、moveコンストラクターは、次の場合にのみデフォルトとして暗黙的に宣言されます。

  • Xには、ユーザーが宣言したコピーコンストラクターがなく、
  • 移動コンストラクターは、削除済みとして暗黙的に定義されません。

[注:moveコンストラクターが暗黙的に宣言されていないか、明示的に指定されていない場合、moveコンストラクターを呼び出す式は、代わりにcopyコンストラクターを呼び出す可能性があります。—エンドノート]

クラスXの暗黙的に宣言されたmoveコンストラクターの形式はX::X(X&&)

暗黙的に削除されたデフォルト関数について、§12.8/ 12:

暗黙的に宣言されたコピー/移動コンストラクターは、そのクラスのインラインパブリックメンバーです。クラスXのデフォルトのコピー/移動コンストラクターは、Xに次の場合、削除済み(8.4.3)として定義されます。

  • 自明ではない対応するコンストラクターを持つバリアントメンバーであり、Xはユニオンのようなクラスです。
  • Mの対応するコンストラクターに適用されるオーバーロード解決(13.3)により、デフォルトから削除またはアクセスできないあいまいさまたは関数が発生するため、コピー/移動できないクラスタイプM(またはその配列)の非静的データメンバーコンストラクター、または
  • Bの対応するコンストラクターに適用されるオーバーロード解決(13.3)により、デフォルトのコンストラクターから削除またはアクセスできないあいまいさまたは関数が発生するため、コピー/移動できない直接または仮想の基本クラスB、または
  • 移動コンストラクターの場合、非静的データメンバー、または移動コンストラクターを持たず、簡単にコピーできない型の直接または仮想基本クラス。

§12.8/13-18は、関数が暗黙的に生成されたときに関数がどのように機能するかを定義します。

§12.8/19は、コピー代入演算子とムーブ代入演算子を除いて、§12.8/8と同じことを行います。それらは、ここで引用することを保証しないほど十分に類似しています。

より完全な全体像については、これらのセクション全体を読みたいと思うでしょうが、それが一般的な考え方です。暗黙の移動セマンティクスを取得できてうれしいです。


*ただし、デフォルトのコピー関数と同様に、常に正しい動作をするわけではありません。ビッグスリーはビッグファイブになるはずです。(たとえば、ビッグスリーは何かをディープコピーする必要があるときはいつでも実装されます。また、ソースのデータがヌル/リセットされる「ディープムーブ」を実行する必要があります。これは暗黙的に実行されません。)

于 2010-07-19T12:48:24.757 に答える