2

これは、私がこの情報のほとんどを入手した場所です: http://en.cppreference.com/w/cpp/language/move_constructor

どうやらこれらは、暗黙的に生成された移動コンストラクターが機能するための条件です。

  • ユーザー宣言のコピー コンストラクターがない
  • ユーザー宣言のコピー代入演算子はありません
  • ユーザー宣言の移動代入演算子はありません
  • ユーザーが宣言したデストラクタはありません
  • 暗黙的に宣言された移動コンストラクターが削除済みとして定義されていません
  • ユーザーが宣言した移動コンストラクターが存在する場合でも、キーワードを使用して暗黙的に宣言された移動コンストラクターの生成を強制することができます。default

私の質問は次のとおりです。

  1. 暗黙の自動移動コンストラクターに頼るのは安全ですか?
  2. デフォルトのコピー コンストラクターの代わりに実際に機能するかどうかを確認するにはどうすればよいですか?
  3. 最後に、そして最も重要なこととして、それは良いアイデアであり、その理由は何ですか? それとも、常に自分で定義する方が良いですか?

私は3 つのルールに従い、デストラクタ、コピー アンド ムーブ コンストラクタ、コピー アンド ムーブ代入演算子を手動で作成する傾向がありますが、この暗黙的なものについては興味があります。

4

2 に答える 2

5

質問に対する回答は次のとおりです。

  1. 「安全」とはどういう意味ですか? ルールが適用される場合、つまり、サブオブジェクトが移動可能であり、移動コンストラクターの生成を踏みにじるために何もしなかった場合、それが作成され、存在する場合は使用されます。ただし、移動コンストラクターの作成を目に見えないように阻害する、移動不可能なサブオブジェクトを持つことは簡単であることに注意してください。
  2. クラスがムーブ コンストラクターを取得したかどうかを確認するには、コピー コンストラクターとムーブ コンストラクターが使用されているときに一時的に空のベース ログを追加し、オブジェクトを強制的に移動/コピーさせます。対応して使用されるコンストラクターがログに記録されます。
  3. 一般に、どのコードよりも優れたコードはありません。
于 2013-08-24T23:41:31.270 に答える