2010-12-15 8 views
1

コンストラクタを移動するのが新しく、VS2010の動作と全く混同します。私は、リストの据え付けを使用し、クラスAのインスタンスを入れるとコンストラクタ、非constコピーコンストラクタ、リストのemplaceをVS2010に移動します。

A(A&& input) {some code} 

: 私は、私の知る限りでは、このようなものです(クラスAの)移動コンストラクタを設計

mylist.emplace(a); 

私の移動のコンストラクタです呼ばれ、非constコピーコンストラクタが代わりに呼び出されません。

A(A& input) {the same code as move constructor} 

一方、私はこれを行うとき:

mylist.emplace(A(2)); 

私の移動コンストラクタは、想定されているように呼び出されます。だから、私の質問は:

  1. リストのemplaceが私の移動コンストラクタの代わりに非constコピーコンストラクタを呼び出すのはなぜですか?
  2. 非constコピーコンストラクタは、実際には移動コンストラクタを定義する別の方法ですか?
  3. この動作は正しいですか(C++ 0xコンパイラの場合)か、それともVS2010の動作ですか?

ありがとうございます。

+0

コピーコンストラクタの動作が移動コンストラクタと同じ場合は、クラスが大きく壊れていませんか? – UncleBens

+0

@UncleBens:必ずしも両方ともコピーを作成する必要はありません。 – ybungalobill

+0

@ybungalobill:そのような場合、なぜmoveコンストラクタを定義する(おそらく無効にするのではなく)のですか?コピーコンストラクタがコピーを作成する場合、なぜ非const参照を取るべきですか? – UncleBens

答えて

2
mylist.emplace(a); 

ここでaはl-値であるため、移動するのではなくコピーします。具体的にはmoveにする必要があります。

mylist.emplace(std::move(a)); 

はい、問題はありません。

関連する問題