`=default` ムーブコンストラクタはメンバー単位のムーブコンストラクタと同等ですか? 質問する

`=default` ムーブコンストラクタはメンバー単位のムーブコンストラクタと同等ですか? 質問する

これですか

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;
}

?

ベストアンサー1

はい、どちらも同じです。

しかし

struct Example { 
    string a, b; 

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

このバージョンでは、本文の定義をスキップできます。

ただし、宣言する際にはいくつかのルールに従う必要がありますexplicitly-defaulted-functions

8.4.2 明示的にデフォルト設定された関数 [dcl.fct.def.default]

次の形式の関数定義:

  attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt = default ;

明示的にデフォルト定義。明示的にデフォルト設定された関数は

  • 特別なメンバー関数である、

  • 宣言された関数型が同じである(ただし、異なる可能性がある)ref 修飾子ただし、コピーコンストラクタまたはコピー代入演算子の場合、パラメータ型は「非constへの参照T」(Tメンバー関数のクラス名)となり、暗黙的に宣言されているかのようになる。

  • デフォルトの引数はありません。

おすすめ記事