次のクラスを検討してください。
class A
{
public:
std::string field_a;
std::string field_b;
}
ここで、次のコピーの作成を検討してください。
A a1(a2);
A
明示的なコピー コンストラクターがなくても、コピーの構築は適切にコピーされます。これは、コピー コンストラクターstd::string
がコンパイラによって生成された暗黙的なコピー コンストラクターによって呼び出されるためです。
私が知りたいのは、ムーブ コンストラクションについても同じことが言えますか?
編集:ここでのテストは次のことを示しています:
A a2(std::move(a1));
特定のムーブコンストラクターが次の場合を除き、実際にはコピー構築になります。
A( A && other ) : a(std::move(other.a)) {}
定義されています。
EDIT EDIT 私は Stephan T Lavavej に ping を打って、なぜ VC 2012 が暗黙のムーブ コンストラクター生成に関するドラフト 12.8 の状態に従っていないように見えるのかを尋ねました。彼は親切にも次のように説明してくれました。
バグというより「まだ実装されていない機能」です。VC は現在、私が右辺値参照 v2.0 と呼んでいるものを実装しています。ここでは、移動 ctors/assigns が暗黙的に生成されることはなく、copy ctors/assigns の暗黙的な生成に影響を与えることもありません。C++11 は右辺値参照 v3.0 を指定します。これは、あなたが見ているルールです。