2013-07-30 16 views
14

ページのHow to: Write a Move Constructorマイクロソフトでは、移動コンストラクタを作成する方法の例を示しています。それは本質的形式は次のとおりです。std :: moveは既にT &&の変数に移動します

MyClass::MyClass(MyClass&& lhs) 
{ 
    *this = std::move(lhs); 
} 

私が試してみましたとstd::moveは本当にここが必要ですが、なぜ?唯一のことはT&&に変換することだと思った。しかし、lhsは既にタイプMyClass&&ですか?

+14

名前付き参照は左辺値です。 *常に*。 –

+3

これは長いですが、[これは良い読書です](http://thbecker.net/articles/rvalue_references/section_01.html)は、価値評価についてのすべてを学びます。 –

+0

R. Martino Fernandes:ありがとう!私は答えとしてそれを受け入れるだろう。 – Petter

答えて

20

名前付き右辺値は左辺値です。無名の左辺値は右辺値です。これは、STD ::移動コールが必要である理由を理解することが重要である:foo&& r = foo(); foo f = std::move(r);

は、この答えを見てみましょう:https://stackoverflow.com/a/5481588/1394283それは非常によくそれを説明しています。


この機能を見てみましょう:

void foo(X&& x) 
{ 
    X anotherX = x; 
    // ... 
} 

興味深い質問がある:X年代の過負荷がコンストラクタがfooの体内で呼び出さコピーしていますか?ここでは、xはrvalue参照として宣言された変数です。したがって、x自体も、値がX(X&& rhs);のようにバインドする必要があります。

我々だけで移動し、そこから事は、それが、そのことであるため、移動sematicsが

X anotherX = x; 
// x is still in scope! 

のように、名前を持っている何かに暗黙のうちに適用できるようにすることは危険な混乱とエラーが発生しやすくなります私たちはちょうどpilfered、まだコードの次の行にアクセスすることができます。 しかし、移動セマンティクスの全体のポイントは、移動したものが移動した直後に死ぬという意味で「問題ではない」場合にのみ適用することでした。右辺値参照として宣言されている

物事は左辺値または右辺値になります右辺値参照の設計者はもう少し微妙なそれよりもソリューションを選択した理由です

。識別基準はで、名前がある場合は左辺値です。そうでなければ、それはrvalueです。

出典:http://thbecker.net/articles/rvalue_references/section_05.html

+1

公正であるために、 'T&foo()'の戻り値は名前を持たず、左辺値です。 – Yakk

+0

@Yakkあなたは正しいです。 _ ** **無名の値**の参照は右の値です._ここでは右の値についてのみ説明します。 –

関連する問題