在C++11中全部的值必屬於左值、右值二者之一,右值又能夠細分爲純右值、將亡值。在C++11中能夠取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值(將亡值或純右值)。舉個例子,int a = b+c, a 就是左值,其有變量名爲a,經過&a能夠獲取該變量的地址;表達式b+c、函數int func()的返回值是右值,在其被賦值給某一變量前,咱們不能經過變量名找到它,&(b+c)這樣的操做則不會經過編譯。編程
在理解C++11的右值前,先看看C++98中右值的概念:C++98中右值是純右值,純右值指的是臨時變量值、不跟對象關聯的字面量值。臨時變量指的是非引用返回的函數返回值、表達式等,例如函數int func()的返回值,表達式a+b;不跟對象關聯的字面量值,例如true,2,」C」等。
C++11對C++98中的右值進行了擴充。在C++11中右值又分爲純右值(prvalue,Pure Rvalue)和將亡值(xvalue,eXpiring Value)。其中純右值的概念等同於咱們在C++98標準中右值的概念,指的是臨時變量和不跟對象關聯的字面量值;將亡值則是C++11新增的跟右值引用相關的表達式,這樣表達式一般是將要被移動的對象(移爲他用),好比返回右值引用T&&的函數返回值、std::move的返回值,或者轉換爲T&&的類型轉換函數的返回值。
將亡值能夠理解爲經過「盜取」其餘變量內存空間的方式獲取到的值。在確保其餘變量再也不被使用、或即將被銷燬時,經過「盜取」的方式能夠避免內存空間的釋放和分配,可以延長變量值的生命期。函數
左值引用就是對一個左值進行引用的類型。右值引用就是對一個右值進行引用的類型,事實上,因爲右值一般不具備名字,咱們也只能經過引用的方式找到它的存在。左值引用只有一個取地址符,例如(int &),右值引用有兩個取地址符,例如(int&&)。
右值引用和左值引用都是屬於引用類型。不管是聲明一個左值引用仍是右值引用,都必須當即進行初始化。而其緣由能夠理解爲是引用類型自己本身並不擁有所綁定對象的內存,只是該對象的一個別名。左值引用是具名變量值的別名,而右值引用則是不具名(匿名)變量的別名。
左值引用一般也不能綁定到右值,但常量左值引用是個「萬能」的引用類型。它能夠接受很是量左值、常量左值、右值對其進行初始化。不過常量左值所引用的右值在它的「餘生」中只能是隻讀的。相對地,很是量左值只能接受很是量左值對其進行初始spa
int &a = 2; # 左值引用綁定到右值,編譯失敗 int b = 2; # 很是量左值 const int &c = b; # 常量左值引用綁定到很是量左值,編譯經過 const int d = 2; # 常量左值 const int &e = c; # 常量左值引用綁定到常量左值,編譯經過 const int &b =2; # 常量左值引用綁定到右值,編程經過
右值值引用一般不能綁定到任何的左值,要想綁定一個左值到右值引用,一般須要std::move()將左值強制轉換爲右值,例如:
.net
int a; int &&r1 = c; # 編譯失敗 int &&r2 = std::move(a); # 編譯經過
下表列出了在C++11中各類引用類型能夠引用的值的類型。值得注意的是,只要可以綁定右值的引用類型,都可以延長右值的生命期。
原文連接:
https://blog.csdn.net/hyman_yx/article/details/52044632
code