【C++grammar】左值、右值和将亡值
目錄
- C++03的左值和右值
- C++11的左值和右值
- 將亡值
在C++03中就有相關(guān)的概念
C++03的左值和右值
通俗的理解:
(1) 能放在等號(hào)左邊的是lvalue
(2) 只能放在等號(hào)右邊的是rvalue
(3) lvalue可以作為rvalue使用
對(duì)于第三點(diǎn)可以舉個(gè)例子:
int x ;
x = 6; //x是左值,6是右值
int y ;
y = 6; //y是左值,6是右值
y = x; //x作為右值,所以左值是可以作為右值使用的
C++11對(duì)左值和右值做出了更加詳細(xì)的劃分。
C++11的左值和右值
表達(dá)值分為泛左值、右值;
泛左值分為左值和將亡值(涉及右值引用)
右值可分為純右值和將亡值(涉及右值引用)
左值指定了一個(gè)函數(shù)或者對(duì)象(表達(dá)式計(jì)算得出的結(jié)果),它是一個(gè)可以取地址的表達(dá)式。
也就是說,如果一個(gè)函數(shù)或者對(duì)象可以取地址,那么他就是一個(gè)左值。
左值例子:
(1) 解引用表達(dá)式p
(2) 字符串字面量"abc"
(3) 前置自增/自減表達(dá)式 ++i / --i
(4) 賦值或復(fù)合運(yùn)算符表達(dá)式(x=y或m=n等)
純右值是不和對(duì)象相關(guān)聯(lián)的值(字面量)或者其求值結(jié)果是字面量或者一個(gè)匿名的臨時(shí)對(duì)象.
純右值例子:
(1) 除字符串字面量以外的字面量,比如 32, ‘a(chǎn)’
(2) 返回非引用類型的函數(shù)調(diào)用 int f() { return 1;}
(3) 后置自增/自減表達(dá)式i++/i–
(4) 算術(shù)/邏輯/關(guān)系表達(dá)式(a+b、a&b、a<<b)(a&&b、a||b、~a)(a==b、a>=b、a<b)
(5) 取地址(&x)
如:
72.0f
a–
x為一個(gè)整型變量,&x
左值可以當(dāng)成右值使用
將亡值
將亡值也指定了一個(gè)對(duì)象,是一個(gè)將純右值轉(zhuǎn)換為右值引用的表達(dá)式:
&&這里不是邏輯與運(yùn)算符,而是右值引用
我們先來看什么是左值引用:
a是個(gè)左值,b是a的引用,為左值引用。
如果a是個(gè)常量22,我們對(duì)其引用就會(huì)出錯(cuò):
如下:
為了解決這個(gè)問題,可以使用const 引用(常量左值引用)引用純右值:
這樣就能保證22(純右值)不會(huì)通過b修改,這樣b就相當(dāng)于是22的別名。
當(dāng)然還有另一種引用純右值的方法就是右值引用了:
通過右值引用可以使純右值的生存期增加,例如:
int&& rvr1{ 22 }; // 右值引用可以引用純右值
int rv2 =++rv1;
原本22在執(zhí)行完第一個(gè)語句就會(huì)消亡,但是使用右值引用之后,就可以在后面的語句通過調(diào)用右值引用,繼續(xù)使用這個(gè)值了。
總例:
int prv(int x) { return 6 * x; } // pure rvalue int main() {const int& lvr5{ 21 }; // 常量左值引用可引用純右值int& lvr6{ 22 }; // 錯(cuò)!非常量左值引用不可引用純右值int&& rvr1{ 22 }; // 右值引用可以引用純右值int& lvr7{ prv(2) }; // 錯(cuò)!非常量左值引用不可引用純右值int&& rvr2{ prv(2) }; // 右值引用普通函數(shù)返回值rvr1 = ++rvr2; // 右值引用做左值使用}總結(jié)
以上是生活随笔為你收集整理的【C++grammar】左值、右值和将亡值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++进阶】 遵循TDD原则,实现平面
- 下一篇: 单调栈 leetcode整理(二)