声明では:
B(B&& b)
パラメーター は、次の型で宣言されますb
: rvalue への参照B
。
声明では:
A(b)
式 b
は type の左辺値ですB
。
また、左辺値式は右辺値参照にバインドできません。具体的には、ステートメント内の右辺値参照:
A(A&& a)
このロジックは、言語の他の部分から明確に続きます。この関数を考えてみましょう:
void
f(B& b1, B b2, B&& b3)
{
g(b1);
g(b2);
g(b3);
}
のパラメータf
はすべて異なる型で宣言されていますが、式b1
とはすべて型 の左辺値式であるためb2
、がどのようにオーバーロードされても、すべて同じ関数を呼び出します。b3
B
g
g
C++11 では、変数の宣言と、その変数を使用した結果の式を区別することがこれまで以上に重要になっています。また、式には参照型がありません。代わりに、lvalue、xvalue、prvalue のいずれかの値カテゴリがあります。
ステートメント:
A(std::move(c))
std::move
右辺値参照を返すため、問題ありません。右辺値参照を返す関数呼び出しの結果の式には、値カテゴリ xvalue があります。また、prvalues とともに、xvalues は右辺値と見なされます。そして type の右辺値式C
:
std::move(c)
の右辺値参照パラメーターにバインドします: A(A&& a)
。
次の図 (元々は Bjarne Stroustrup によって考案されたもの) が非常に役に立ちます。
expression
/ \
glvalue rvalue
/ \ / \
lvalue xvalue prvalue