C 11 右值引用

2021-07-30 09:27:19 字數 910 閱讀 5973

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 的基礎。而要理解右值引用,就必須先區分左值與右值。對左值和右值的乙個最常見的誤解是 等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物...