許多中文資料將 lvalue 譯為「左值」,rvalue 譯為「右值」,實則誤導。根據權威定義:
lvalue:
l代表 location (位置/地址)。指擁有可定址儲存空間的表達式,可出現在賦值運算子左側。
rvalue:r代表 read (讀取)。指僅具資料值、無儲存地址的表達式,只能出現在賦值右側。
int x;
x = 5; // OK:x 是 lvalue (有地址),5 是 rvalue (常值)
5 = x; // Error:5 是常值,無地址,非 lvalue
C/C++ 中多種表達式皆為 lvalue,不僅是變數:
int a, *p, arr[10];
struct S { int m; } s;
a; // lvalue
*p; // lvalue (解參考指標)
arr[3]; // lvalue (陣列元素)
s.m; // lvalue (成員)
*p + 1; // rvalue (指標運算結果無地址)
const int x = 10;
x = 1; // Error:x 是 const lvalue,不可修改
struct Fun {
int a;
int& operator()() { return a; } // 回傳 lvalue reference
int& operator+(const Fun& f) { return a += f.a; } // 回傳 lvalue reference
int operator-(const Fun& f) { return a - f.a; } // 回傳 rvalue (by value)
};
Fun f, g1, g2;
f() = 1; // OK:f() 回傳 int&,是 lvalue
g1 + g2 = 1; // OK:operator+ 回傳 int&,是 lvalue
g1 - g2 = 1; // Error:operator- 回傳 int,是 rvalue
歷史上賦值語法固定為 lvalue = rvalue,左側必為可定址實體,右側為可讀取值。雖稱呼非精確,但在「賦值語境下」具備直觀性。關鍵在於理解本質:lvalue = 有身份識別的儲存位置,rvalue = 臨時值或純數值。C++11 引入 xvalue (將亡值)、prvalue (純右值) 進一步細化,但核心邏輯不變。