それstd::string
自体が move-ctor を持っているため、暗黙的に定義された move-ctor forC
が適切な移動操作を処理します。自分で定義できない場合があります。ただし、他のデータメンバーがあり、具体的には:
12.8 クラスオブジェクトのコピーと移動
12暗黙的に宣言されたコピー/移動コンストラクターは、そのクラスのインライン パブリック メンバーです。クラス X のデフォルトのコピー/移動コンストラクターは、X が次の場合に削除済み (8.4.3) として定義されます。
— 非自明な対応するコンストラクターを持つバリアント メンバーであり、X は共用体のようなクラスです。
— オーバーロードの解決 (13.3) が M の対応するコンストラクターに適用されるため、コピー/移動できないクラス型 M (またはその配列) の非静的データ メンバー。デフォルトのコンストラクタ、または
— オーバーロードの解決 (13.3) が B の対応するコンストラクターに適用されるため、コピー/移動できない直接または仮想基本クラス B
— 移動コンストラクターの場合、移動コンストラクターを持たず、自明にコピーできない型を持つ非静的データ メンバーまたは直接または仮想基本クラス。
13クラス X のコピー/移動コンストラクターは、それがユーザーによって提供されたり削除されたりしない場合、自明です。
— クラス X には、仮想関数 (10.3) も仮想基本クラス (10.1) も、関数 (10.3) も仮想基本クラス (10.1) もありません。
— 各直接基底クラス サブオブジェクトをコピー/移動するために選択されたコンストラクターは自明であり、
— クラス型 (またはその配列) である X の非静的データ メンバーごとに、そのメンバーをコピー/移動するために選択されたコンストラクターは自明です。それ以外の場合、コピー/移動コンストラクターは自明ではありません。
独自の move-ctor を実装したい場合があります。
move-ctor が必要な場合は、イニシャライザ リスト構文を使用してください。いつも!そうしないと、イニシャライザ リストに記載されていないオブジェクトごとのデフォルトの構築になってしまう可能性があります (これは、デフォルト以外の ctor を持つメンバー オブジェクトに対してのみ強制されるものです)。