lvalue
(左辺値)
C++では,すべての式はlvalue
(locator value)またはrvalue
のどちらかである.
平易に説明すれば,
lvalue
とは代入の左辺,つまり代入先に指定できるような式,rvalue
とは代入先に指定できない式という感じ.
これだけ聞くと“要するに変数?”と思いたくなるかもしれないけど,
C++ではリファレンスを返す関数がつくれたり,演算子(キャスト演算子含む)がオーバーロードできたりするので,そんなに単純でもなかったりする.
[C言語でもポインタについては,ポインタp
に対する*p
はlvalue
になれたり・なれなかったりするので,
C++で何か新しい概念が入ったというわけではないかもしれないけども.]
たとえば,下のサンプルプログラムでは関数f
が参照を返すようになっているため,
この関数f
を代入の左辺においた,f(a, n) = 10;
のような式が許される.
#include <iostream> using namespace std; int& f(int* a, int n) { return a[n]; } int main(void) { const int n = 5; int arr[n] = { 1, 2, 3, 4, 5 }; f(arr, 3) = 10; for (int i = 0; i < n; ++i) cout << arr[i] << endl; return 0; }
lvalue
/rvalue
は,もともとK&Rでは“left value”(左辺値),“right value”(右辺値)の意味だった.
この左辺値・右辺値という表現は直感的でわかりやすいのだけども,よく考えてみると何をして左辺値・右辺値というかが意外にわかりにくい.
そこでANSI規格になった時点では,少し抽象的な表現“Locator VALUE”(位置を特定する値)の意味と読み替えたという経緯があるようだ
(ただし,規格では“Locator VALUE”という表現はださず,そのまま“lvalue
”という言語要素としている).
また,JIS規格では,いろいろ訳語を考えた末,結局“左辺値・右辺値”と普通に訳すことにしたようだけど,
一般用語としては,JIS採用の訳語と同じ左辺値のほかに,lvalue
,ロケータ値,オブジェクト指名子など,いろいろな語・訳語が使われている[2].
[1] | MSDN >>C/C++ Glossary (Deep C++) |
[2] | 平林雅英:『ANSI C言語辞典』,技術評論社,1998. |
lvalue.cpp
Makefile
lvalue.out