在C++中,左值(lvalue)是可以獲取其地址的一個量。由於經常出現在賦值語句的左邊,因此稱之為左值。例如一個有名稱的變量。 例如:
int a=10; //a就是一個左值。
傳統的C++引用,都是左值引用。例如:int &ra=a;將ra關聯到a。這就是左值引用。
C++11,新增了右值引用的概念。用&&代表右值引用。
首先我們來看一下什麼叫做右值。可以說所有不是左值的量都是右值。例如文本,臨時對象或者臨時值(都是不能獲取地址的量)。
右值引用,就是一個對右值的引用。特別地,這是一個當右值是一個臨時對象時使用的概念。例如。
int &&ra=10;
10就是一個右值,ra將是10這個右值的引用。看例子:
#includeusing namespace std; int main() { int &&ra=9; cout<<&ra< 輸出結果:
有趣的是,將右值關聯到右值引用將導致該右值被存儲到特定的位置,且可以獲取該位置的地址。例如,你不能對右值9或者5進行&運算,但是可以對ra進行&運算。
右值引用的目的是提供一些涉及臨時對象時可以選用特定的方法(主要是復制構造函數以及operator=,但並不限於此)。由於知道臨時對象會被銷毀,通過右值引用,某些涉及復制大量數據的操作可以通過簡單地復制指向這些值的指針來實現。
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+t723qL/J0tS9qyZhbXA7JmFtcDvX986qss7K/cu1w/e1xNK7sr+31qOstNO2+Na4tqjT0iYjMjA1NDA70v3Tw7LOyv2ho7+0wP3X06O6PC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">#includeusing namespace std; void showMax(int &a,int &b){ if(a>b) cout<發現showMax(20,15)的時候無法正常編譯。 這是因為20,15是一個右值。下面我們定義一個右值引用版本的showMax();
#includeusing namespace std; void showMax(int &a,int &b){ if(a>b) cout 運行結果:
當調用showMax(20,15)的時候,編譯器將自動調用相對應的右值引用的版本。
作為方法的參數的時候右值引用非常有用,又例如:
#includeusing namespace std; void show(int &a){ cout<<"左值引用:"<
結果:
需要注意的是:
show(a++); //右值引用
show(++a); //左值引用
a++是先取出持久對象a的一份拷貝,再使持久對象a的值加1,最後返回那份拷貝,而那份拷貝是臨時對象(不可以對其取地址),故其是右值;
++a則是使持久對象a的值加1,並返回那個持久對象a本身(可以對其取地址),故其是左值。
右值引用單獨使用的情況很少,一般都是用於作為方法的參數或者函數的參數,使用的最多的情況則是用在移動語義之上。