3

更新: 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 で巧妙な方法で利用できますか?

4

2 に答える 2

6

ええと、何もしませ。これらはすべて自動的に生成されます1。手動で記述する必要があるのは、クラスがリソースを処理するときだけです (そして、3 つのルールに従う必要があります)。これも以前と全く同じです。唯一の違いは、3 つのルールを検討した、セマンティック (移動専用オブジェクトの作成) またはパフォーマンス (通常、移動はコピーよりも高速) のいずれかの理由で移動メンバーを実装したい場合があることです。


1. MSVC 10 は移動コンストラクターを自動的に生成しません。その場合、移動メンバーを自分で書きたいと思うかもしれません:(

于 2012-03-11T22:19:44.933 に答える
1

独自の移動コンストラクター/移動代入演算子を作成する必要があるという MSVC10 と MSVC11 の制限を考えると、私が持っているものは次のとおりです。Stephan T. Lavavejによるこのビデオに基づいています

http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-9-of-n

class Foo 
{
public:

    //Note: don't pass param by reference. Unified assignment operator
    Foo& operator=(Foo other)
    {
        other.swap(*this);
        return *this;
    }

    Foo(Foo&& other)
      : a_(std::move(other.a_),
        b_(std::move(other.b_){}

    Foo(Foo& other)
      : a_(other.a_),
        b_(other.b_){}

private:
    void swap(Foo& other)
    {
        using std::swap;
        swap(a_, other.a_);
        swap(b_, other.b_);
    }

private:
    NonPodTypeA a_;
    NonPodTypeB b_;
};
于 2012-03-12T17:02:29.857 に答える