許多中文資料將 lvalue 譯為「左值」、rvalue 譯為「右值」,易誤以為與賦值號左右兩側綁定。實際上,l 代表 location(位址),r 代表 read(可讀值),與左右無關。
*p、陣列元素 a[i])。5、暫時物件、運算結果)。常數有 rvalue 卻無 lvalue,故 5 = x 非法;const int x 同樣只有 rvalue,不可賦值。
struct Fun {
int a;
int& operator()() { return a; } // 回傳 lvalue
int& operator+(const Fun& f) { return a += f.a; } // 回傳 lvalue
int operator-(const Fun& f) { return a - f.a; } // 回傳 rvalue
};
Fun f, g1, g2;
f() = 1; // 合法:f() 是 lvalue
g1 + g2 = 1; // 合法:operator+ 回傳 lvalue
g1 - g2 = 1; // 錯誤:operator- 回傳 rvalue
此例證明 lvalue 本質是「可定址、可修改」,而非「在左邊」。C/C++ 允許運算子多載回傳參考,使表達式成為 lvalue。
雖然歷史慣稱「左/右值」,且在所有主流語言中賦值目標確實置於左側,但 location/read 解釋更精準涵蓋指標解參考、函式回傳參考等非變數 lvalue。翻譯錯誤源於早期參考書誤譯,並非原理問題。
lvalue required)。operator= 回傳 T&、operator+ 回傳 T)。rvalue reference (T&&) 與移動語意,更需釐清兩者本質差異。