C++の値カテゴリ徹底解説:lvalue・rvalue・xvalue・glvalue・prvalueの違い
C++11以降、すべての式は「値カテゴリ(value category)」という分類に基づいて扱われます。lvalue(左辺値)、rvalue(右辺値)、xvalue、glvalue、prvalueといった用語は一見複雑に感じられますが、それぞれ明確な定義が存在します。本記事では、各値カテゴリの意味と具体例をわかりやすく解説します。
lvalue(左辺値)とは
lvalueとは、プログラムからアクセス可能なアドレスを持つ式です。名前を持ち、代入式の左辺に置けることが多いのが特徴です。
lvalueに該当する式の例:
- 変数名(const変数を含む)
- 配列の要素
- lvalue参照を返す関数呼び出し
- ビットフィールド
- 共用体(union)
- クラスのメンバ
xvalueとは
xvalue(eXpiring value:期限切れの値)は、プログラムが直接アクセスできるアドレスを持ちませんが、右辺値参照を初期化するために使用できる式です。右辺値参照を通じて間接的にその式へアクセスできます。
xvalueに該当する式の例:
- 右辺値参照を返す関数呼び出し
std::move()の戻り値- 配列の添字演算子の一部の用法
glvalueとは
glvalue(generalized lvalue:一般化された左辺値)は、lvalueまたはxvalueの総称です。つまり、何らかのオブジェクトや関数に関連付けられた同一性(identity)を持つ式を指します。
rvalue(右辺値)とは
rvalueは、歴史的には「代入式の右辺に現れることができる値」と呼ばれてきた概念です。現在のC++における定義では、以下のいずれかを指します。
- xvalue
- 一時オブジェクト、またはそのサブオブジェクト
- オブジェクトに関連付けられていない値
prvalueとは
prvalue(pure rvalue:純粋な右辺値)は、プログラムからアクセス可能なアドレスを持たない式です。
prvalueに該当する式の例:
- リテラル(
42、"hello"など) - 参照型以外を返す関数呼び出し
値カテゴリ同士の関係まとめ
各カテゴリの包含関係は以下のように整理できます。
- glvalue = lvalue + xvalue
- rvalue = prvalue + xvalue
- すべての式は、lvalue・xvalue・prvalueのいずれか1つに必ず分類されます
xvalueはglvalueとrvalueの両方に属する特殊なカテゴリであり、この点がC++の値カテゴリ体系を理解するうえで重要なポイントです。ムーブセマンティクスや右辺値参照を正しく活用するためにも、これらの違いをしっかり押さえておきましょう。
-
C++のsigned(符号付き)とunsigned(符号なし)キーワードとは?違いと使い方を解説
C++における符号付き・符号なしデータ型の基本C++では、すべての数値型に対して「符号付き(signed)」か「符号なし(unsigned)」かを指定できます。たとえば、int型を宣言する際に正の整数のみを扱うよう指定することも可能です。特別な指定がない場合、すべての整数型はデフォルトで符号付き(signed)として扱われます。つまり、正負どちらの値も保持できるということです。一方、unsignedキーワードを使用すると、符号を持たない変数を宣言できます。サンプルコード#include<iostream>using namespace std;int main() { &
-
C#における右辺値(rvalue)と左辺値(lvalue)とは?違いをわかりやすく解説
C#では、式(expression)はその性質によって分類されます。代入演算子「=」を扱ううえで重要になるのが、左辺値(lvalue)と右辺値(rvalue)という2つの概念です。それぞれの特徴を正しく理解することで、代入文の動作やコンパイルエラーの原因が明確になります。左辺値(lvalue)とはlvalue(left value:左辺値)とは、代入式の左側にも右側にも記述できる式のことです。変数は典型的なlvalueであり、メモリ上の特定の場所を参照するため、そこに値を格納することができます。右辺値(rvalue)とはrvalue(right value:右辺値)とは、代入式の右側には記述で