C++の左辺値(lvalue)と右辺値(rvalue)とは?わかりやすく解説
C++における左辺値と右辺値の基本
C++を学んでいると、必ず「左辺値(lvalue)」と「右辺値(rvalue)」という概念に出会います。この2つを正しく理解することは、代入演算や参照、さらにはムーブセマンティクスを理解する上で非常に重要です。
左辺値(lvalue)とは
左辺値(lvalue:locator value)とは、メモリ上の特定できる場所(アドレス)を占有しているオブジェクトを表す式のことです。つまり、「&」演算子を使ってアドレスを取得できるものが左辺値です。
例えば、変数は典型的な左辺値です。変数には明確なメモリ上の住所が割り当てられているためです。
右辺値(rvalue)とは
右辺値は排他的に定義されます。すべての式は左辺値か右辺値のどちらかに分類されるため、右辺値とは「メモリ上の特定できる位置を占有するオブジェクトを表さない式」のことです。
例えば、数値リテラル(10 や 3.14 など)や計算結果の一時的な値(a + b の結果など)は右辺値です。これらには識別可能なメモリ上の場所がありません。
具体例で理解する
代入演算子「=」は、その左側のオペランドとして左辺値を要求します。したがって、次のコードは有効です。
int i = 10;
しかし、次のコードはコンパイルエラーになります。
int i; 10 = i; // エラー!
これはなぜでしょうか。i はメモリ上にアドレスを持つため左辺値です。一方、リテラルの 10 には特定可能なメモリ上の場所がないため右辺値です。右辺値である 10 に対して i の値を代入しても意味がない、というわけです。
まとめ
- 左辺値(lvalue):メモリ上にアドレスを持つ、特定できる場所を占めるオブジェクト(例:変数)
- 右辺値(rvalue):特定できるメモリ上の場所を持たない一時的な値(例:リテラル、計算結果)
- 代入の左辺には必ず左辺値が必要
なお、C++11以降では右辺値参照(rvalue reference)が導入され、この概念はムーブセマンティクスの基礎となっています。左辺値と右辺値の違いをしっかり押さえておくことで、より高度な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:右辺値)とは、代入式の右側には記述で