1. ホーム
  2. c++

[解決済み] デフォルトの移動コンストラクタはメンバ単位の移動コンストラクタと同じですか?

2022-06-09 20:28:17

質問

これは

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

?

どのように解決するのですか?

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

しかし

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 ;

明示的に既定された という定義があります。明示的にデフォルト化された関数は

  • は特別なメンバ関数でなければならない。

  • 宣言された関数型が同じであること(ただし 参照修飾子 また、コピーコンストラクタやコピー代入演算子の場合、パラメータの型は "nononst T " とすることができる。 T はメンバ関数のクラス名) が暗黙のうちに宣言されていたかのように見えます。

  • はデフォルトの引数を持ちません。