c++中的引用允許你為以及存在的物件建立乙個新的名字。對新引用所做的訪問和修改操作,都會影響到它的原型(被引用的物件)。
例如:
int
var = 2;
int& ref = var;
ref = 9;
// ref = 9;
// var = 9;
這種方式被稱為左值引用——對左值的引用。左值這個概念**與c語言,指的是可以放在賦值表示式左邊的事物——在棧上或堆上分配的命名物件,或者其它有明確的記憶體位址的物件成員。右值這個概念也來自c語言,值的是可以出現在賦值表示式右側的物件——例如,文字常量和臨時變數。因此,左值引用只能被繫結在左值上,而不是右值。
例如下面這樣寫是錯的:
// 編譯錯誤
int& num = 1;
但是你可以使用下面的這種方式來對乙個右值進行引用:
const
int& i = 1;
i是乙個const左值,之所以可以這樣寫,是因為發生了隱式轉換。就像我們可以對左值的const引用建立臨時性的物件,並將其作為引數傳遞給函式。比如:
void print(const
string& s);
print("hello"); //建立了string的物件
在c++11標準中介紹了右值引用(rvalue reference),這種方式只能繫結右值,不能繫結左值,它通過兩個&&來進行宣告:
int&& i = 1;
int j = 42;
int&& k = j; //編譯錯誤
因此可以通過函式過載的方式來確定:函式有左值或右值為引數的時候,看是否能被同名且對應引數為左值或有值引用的函式所過載。 c 11 右值引用
右值引用 是一種復合型別,跟c 的傳統引用很類似。為更準確地區分兩種型別,我們把傳統的c 引用稱為 左值引用 而使用 引用 這一術語時,我們的意思同時包含兩種引用 左值引用和右值引用。右值引用的行為跟左值引用類似,不同之處在於 右值引用可以繫結到臨時量 右值 而 非const的 左值引用卻不能繫結到...
C 11 右值引用
消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。能夠更簡潔明確地定義泛型函式。1.右值引用 int a a 1 here,a is an lvalue 上述的a就是乙個左值。c 11中左值的宣告符號為 為了和左值區分,右值的宣告符號為 printreference const str...
C 11右值引用
c 11中引入的乙個非常重要的概念就是右值引用。理解右值引用是學習 移動語義 move semantics 的基礎。而要理解右值引用,就必須先區分左值與右值。對左值和右值的乙個最常見的誤解是 等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物...