LoginSignup
83
55

More than 5 years have passed since last update.

右辺値、左辺値などの細かい定義

Last updated at Posted at 2015-08-27

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

N3337 3.10 図1のコピペ。
image.jpg

83
55
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
55