139

これは

struct Example { 
    string a, b; 

    Example(Example&& mE) : a{move(mE.a)}, b{move(mE.b)} { }
    Example& operator=(Example&& mE) { a = move(mE.a); b = move(mE.b); return *this; } 
}

これに相当する

struct Example { 
    string a, b;

    Example(Example&& mE)            = default;
    Example& operator=(Example&& mE) = default;
}

?

4

4 に答える 4

31

はい、デフォルトの移動コンストラクターは、そのベースとメンバーのメンバーごとの移動を実行します。

Example(Example&& mE) : a{move(mE.a)}, b{move(mE.b)} { }

次と同等です。

Example(Example&& mE)                 = default;

これは、ドラフト C++11 標準セクション12.8 のクラス オブジェクトのコピーと移動の段落13に移動することで確認できます(これは、次のように述べられています):

デフォルト設定され、削除済みとして定義されていないコピー/移動コンストラクターは 、それが odrused (3.2) である場合、または最初の宣言後に明示的にデフォルト設定されている場合、暗黙的に定義されます。[注: copy/move コンストラクターは、たとえ実装がその odr-use (3.2、12.2) を省略したとしても、暗黙のうちに定義されます。—エンドノート][...]

そしてパラグラフ15には次のように書かれています:

非共用体クラス X の暗黙的に定義されたコピー/移動コンストラクターは、そのベースとメンバーのメンバー単位のコピー/移動を実行します。[ 注: 非静的データ メンバーのブレースまたはイコール初期化子は無視されます。12.6.2 の例も参照してください。--end note ] 初期化の順序は、ユーザー定義のコンストラクターでのベースとメンバーの初期化の順序と同じです (12.6.2 を参照)。x をコンストラクターのパラメーターにするか、移動コンストラクターの場合はパラメーターを参照する xvalue とします。各ベースまたは非静的データ メンバーは、そのタイプに適した方法でコピー/移動されます。

  • メンバーが配列の場合、各要素は x の対応するサブオブジェクトで直接初期化されます。
  • メンバー m が右辺値参照型 T&& を持つ場合、static_cast(xm) で直接初期化されます。
  • それ以外の場合、ベースまたはメンバーは、x の対応するベースまたはメンバーで直接初期化されます。

仮想基本クラスのサブオブジェクトは、暗黙的に定義されたコピー/移動コンストラクターによって 1 回だけ初期化されるものとします (12.6.2 を参照)。

于 2014-08-04T17:03:13.083 に答える