1,左值和右值
定義:左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號右邊的變數(或表示式),換句話說,就是表示記憶體中可以定址,可以給它賦值(const型別的變數例外);右值指的則是只能出現在等號右邊的變數(或表示式),表示可以知道它的值(例如常數)。變數位址可讀可寫的是左值,只可讀的是右值。
注意:在 c 語言中,通常來說有名字的變數就是左值,而由運算操作(加減乘除,函式呼叫返回值等)所產生的中間結果(沒有名字)就是右值。在 c++ 中,每乙個表示式都會產生乙個左值,或者右值,相應的,該表示式也就被稱作「左值表示式", 「右值表示式」。對於基本資料型別來說(primitive types),左值右值的概念和 c 沒有太多不同,不同的地方在於自定義的型別,而且這種不同比較容易讓人混淆:
對於基礎型別,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修飾(cv-qualitification ignored)
對於自定義的型別(user-defined types),右值卻允許通過它的成員函式進行修改。(c++特有的)
3)右值不能當成左值使用(但左值可以當成右值使用)。另外值得注意的是,對於前面提到的右值的兩個特性:
(1) 右值允許呼叫成員函式。
(2) 右值只能被 const reference 指向。
(3) 右值不能當成左值使用,但左值可以當成右值使用
總結:
純右值:***非引用返回的臨時變數( int func(void) )***、運算表示式產生的臨時變數(b+c)、原始字面量(2)、lambda表示式等。
將亡值:將要被移動的物件、t&&函式返回值、std::move返回值和轉換為t&&的型別的轉換函式的返回值。
int i = 9; //有乙個記憶體 取個名字叫做i, 存了9
int& r1 = i; //左值引用:r1是i的別名
int&& r = std::move(i); //右值引用: 直接使用9,std::move() 函式,把左值轉成右值
const cs& ref = get_cs(); //右值只能被 const 型別的 reference 所指向
c 之左值引用和右值引用
一 左值與右值定義 左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號右邊的變數 或表示式 右值指的則是只能出現在等號右邊的變數 或表示式 在 c 語言中,通常來說有名字的變數就是左值 如上面例子中的 a,b 而由運算操作 加減乘除,函式呼叫返回值等 ...
C C 差異之左值右值
c與c 在語法細節上還是有一些差異的,雖然一般情況下可能這些差異不足以造成結果的區別,但有些 確實會有影響。這次,主要總結下左值右值的差異。在c中,很多左值運算子的結果都不再是左值,然而在c 中,只要邏輯上可行,左值運算子的結果仍然是左值。c 的這種方式,讓運算子表示式之間的靈活性更大。1 i,我們...
c 11之左值引用和右值引用
c 11中增加了右值引用和move語義來避免一些不必要的構造和copy操作,以此來提公升程式的執行效率。首先說左值和右值,他們絕不是簡單的等號左邊和右邊的區別,總結來說 1 左值可以定址,而右值不可以。2 左值可以被賦值,右值不可以被賦值,可以用來給左值賦值。3 左值可變,右值可變 僅對基礎型別適用...