更新: MSVC10 を使用していますが、デフォルトの移動セマンティクスが得られません
いくつかのポッド以外のメンバーを持つ通常のクラスを作成したいとしましょう。
class Foo {
NonPodTypeA a_;
NonPodTypeB b_;
}
いつものように、コピー コンストラクターと、コピー コンストラクターを使用する代入演算子を実装します。
Foo(const Foo& other) : a_(other.a_), b_(other.b_) {}
Foo& operator=(const Foo& other) {
Foo constructed(other);
*this = std::move(constructed);
return *this;
}
次に、移動コンストラクターと移動割り当てを実装します。これは、すべてのメンバーに対して std::move の代わりに std::swap を使用します。これは、移動セマンティクスが実装される前に記述される可能性があるためです。移動セマンティクスが実装されているため、実装を省略できます。スワップメンバー関数:
Foo(Foo&& other) {
::std::swap(a_, other._a);
::std::swap(b_, other._b);
}
Foo& operator=(Foo&& other) {
::std::swap(a_, other._a);
::std::swap(b_, other._b);
return *this;
}
そして、ここに私の質問があります。メンバーについて何も知らないと仮定して、ここで何かをより一般的に行うことはできますか?
たとえば、move-constructor は const 宣言されたメンバーと互換性がありませんが、Foo(Foo&& other) : a_(std::move(other.a_)), b_(std::move(other.b_)){}
move-semantics のないクラスがコピーされないことを確認できないため、move コンストラクターを実装すると? move-constructor を move-assignment で巧妙な方法で利用できますか?