在c++03中就有相關的概念
通俗的理解:
(1) 能放在等號左邊的是lvalue對於第三點可以舉個例子:(2) 只能放在等號右邊的是rvalue
(3) lvalue可以作為rvalue使用
int x ;
x = 6; //x是左值,6是右值
int y ;
y = 6; //y是左值,6是右值
y = x; //x作為右值,所以左值是可以作為右值使用的
c++11對左值和右值做出了更加詳細的劃分。
表達值分為泛左值、右值;
泛左值分為左值和將亡值(涉及右值引用)
右值可分為純右值和將亡值(涉及右值引用)
左值指定了乙個函式或者物件(表示式計算得出的結果),它是乙個可以取位址的表示式。
也就是說,如果乙個函式或者物件可以取位址,那麼他就是乙個左值。
int lv1
;// object
intmain()
;// lvalue reference to object
int* lv3
;// pointer to object
}int
&lv4()
// function returning lvalue reference
左值例子:
(1) 解引用表示式p純右值是不和物件相關聯的值(字面量)或者其求值結果是字面量或者乙個匿名的臨時物件.(2) 字串字面量"abc"
(3) 前置自增/自減表示式 ++i / --i
(4) 賦值或復合運算子表示式(x=y或m=n等)
純右值例子:
(1) 除字串字面量以外的字面量,比如 32, 『a』如:(2) 返回非引用型別的函式呼叫 int f()
(3) 後置自增/自減表示式i++/i–
(4) 算術/邏輯/關係表示式(a+b、a&b、a<=b、a(5) 取位址(&x)
72.0f左值可以當成右值使用a–x為乙個整型變數,&x
將亡值也指定了乙個物件,是乙個將純右值轉換為右值引用的表示式:
&&這裡不是邏輯與運算子,而是右值引用
int
&& rvr1
;// 右值引用可以引用純右值
我們先來看什麼是左值引用:
a是個左值,b是a的引用,為左值引用。
int a =1;
int& b = a;
如果a是個常量22,我們對其引用就會出錯:
如下:
int
& b;
//錯!非常量左值引用不可引用純右值
為了解決這個問題,可以使用const 引用(常量左值引用)引用純右值:
這樣就能保證22(純右值)不會通過b修改,這樣b就相當於是22的別名。
const
int& b
;
當然還有另一種引用純右值的方法就是右值引用了:
通過右值引用可以使純右值的生存期增加,例如:
int&& rvr1; // 右值引用可以引用純右值
int rv2 =++rv1;
原本22在執行完第乙個語句就會消亡,但是使用右值引用之後,就可以在後面的語句通過呼叫右值引用,繼續使用這個值了。
總例:
int
prv(
int x)
// pure rvalue
intmain()
;// 常量左值引用可引用純右值
int& lvr6
;// 錯!非常量左值引用不可引用純右值
int&& rvr1
;// 右值引用可以引用純右值
int& lvr7
;// 錯!非常量左值引用不可引用純右值
int&& rvr2
;// 右值引用普通函式返回值
rvr1 =
++rvr2;
// 右值引用做左值使用
}
簡介C 11中的左值 純右值 將亡值
在c 11以後,表示式按值類別,可分為3種 另,泛左值 generalized lvalue,glvalue 左值 將亡值 右值 right value,rvalue 純右值 將亡值 以下詳細講解 這裡解釋一下 具名的右值引用是左值 看下面的 void foo x a 這裡 a 是乙個具名的右值引用...
左值和右值,左值引用和右值引用
左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...
左值和右值
c c 語言中可以放在賦值符號左邊的變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。或者說左值是代表乙個記憶體位址值,並且通過這個記憶體位址,就可以對記憶體進行讀並且寫 主要是能寫 操作 這也就是為什麼左值可以被賦值的原因了。相對應的還有右值 當乙個符號或者常量放在操作...