glvalue、rvalue、lvalue、xvalue、prvalueといった言葉を聞いたことがあると思います。黒魔術師や闇の軍団の方たちのお話ではさらっとでてくるこの言葉ですが、普通は細かい定義を把握しているわけではないと思います。なので、備忘録的にメモ書きをしておくことにしました。
気になったところ、間違い等ございましたらコメントをいただけると幸いです。
#expression
式。まずはここから。C++の全ての式は何らかの値であり、オブジェクトまたはポインタである。
1 + 2; // expression ; an object
3; // expression ; an object
func(); // expression ; an object
&func; // expression ; a pointer
lvalue
左辺値。代入式の左側にくることができる値のこと。この名前は上の理由から慣習的についたものであるが、当然右辺にくることもある。
int n = 0;
n = 1; // n is lvalue.
int m = n; // n is lvalue.
int& func();
func() = 12; // the result of func() is lvalue.
rvalue
右辺値。これも慣習的についた名前だが、基本的に左辺にくることはない。
以下に紹介するxvalueとprvalueに分類できる。
int n = 0; // 0 is rvalue ; prvalue
int m = std::move(n); // the result of std::move(n) is rvalue ; xvalue
prvalue
pure rvalueの略。純粋右辺値。C++03までは全てのrvalueがここに分類される。
リテラルや、参照を返す関数を除く関数の戻り値がここに分類される。
int func();
func(); // the result of func() is prvalue.
xvalue
eXpiring valueの略。死にかけの値の意で、C++11からは左辺値を右辺値参照にキャストすることで一時オブェクトと同じ扱いをさせることができるが、そのような余命宣告をされたオブジェクトがxvalueに分類される。ムーブセマンティクスの最も基本となる概念。
int n = 0;
int m = static_cast< int&& >(n); // static_cast< int&& >(n) is xvalue.
int&& func();
func(); // the result of func() is xvalue.
glvalue
generalized lvalueの略、総合lvalue。
lvalueとxvalueを包含する概念。xvalueは右辺値参照であり、右辺値の扱いではあるが、本質はlvalueである。
そのため、lvalueとxvalueを総称してglvalueと呼ぶ。
int n = 0;
n; // glvalue ; lvalue
std::move(n); // glvalue ; xvalue