左值(lvalue)和右值(rvalue)是 c/c++ 中乙個比較晦澀基礎的概念,不少寫了很久c/c++的人甚至沒有聽過這個名字,但這個概念到了 c++11 後卻變得十分重要,它們是理解 move/forward 等新語義的基礎。
左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號右邊的變數(或表示式),右值指的則是只能出現在等號右邊的變數(或表示式).
int a;
int b;
a = 3;
b = 4;
a = b;
b = a;
// 以下寫法不合法。
= a;
a+b = 4;
在 c 語言中,通常來說有名字的變數就是左值(如上面例子中的 a, b),而由運算操作(加減乘除,函式呼叫返回值等)所產生的中間結果(沒有名字)就是右值,如上的 3 + 4, a + b 等。我們暫且可以認為:左值就是在程式中能夠尋值的東西,右值就是沒法取到它的位址的東西(不完全準確),但如上概念到了 c++ 中,就變得稍有不同。
具體來說,在 c++ 中,每乙個表示式都會產生乙個左值,或者右值,相應的,該表示式也就被稱作「左值表示式", "右值表示式"。對於基本資料型別來說(primitive types),左值右值的概念和 c 沒有太多不同,不同的地方在於自定義的型別,而且這種不同比較容易讓人混淆:
1) 對於基礎型別,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修飾(cv-qualitification ignored)
2) 對於自定義的型別(user-defined types),右值卻允許通過它的成員函式進行修改。
先只了解了這麼多,以後有更深的了解再說。
c 中左值與右值的區別
c 中常出現error為 非常量引用的初始值必須為左值。即說明你引用不是左值,可能為右值。那麼左值與右值的區別是什麼呢?看能否對表示式取位址,如果能,則為左值 否則為右值。例如 int i 5 int a i 這時編譯通過,但是如果 int a 5 這樣就出錯了 這個5和i有什麼區別,答案就是5是右...
C 中的左值與右值
1.c 左值與右值概念 變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的 對於每個變數,都有2個值與其相關聯 1 資料值,儲存在某個記憶體位址中,也稱右值 rvalue 右值是被讀取的值 read value 文字常量和變數都可被用於右值。2 位址值,即儲存資料值的那塊記憶體位址,...
c 中的左值與右值
左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,有的人可能甚至沒有聽過,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move,forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號...