c 右值引用

2021-09-28 11:29:56 字數 981 閱讀 6440

首先,什麼是左值、右值?

左值是能出現在等號左邊和右邊的變數,右值是只能出現在等號右邊的變數(或表示式)。

左值引用為 & , 而右值引用為 &&。

那麼為什麼需要右值引用呢?主要是為了處理c++臨時物件的低效的問題,使用右值引用可以減少不必要的拷貝構造。

舉個例子:

#include using namespace std;

class a

a(const a& t)

int* num;

};a get_a()

int main()

輸出結果為:

constructor

copy

copy

呼叫了兩次拷貝建構函式(一次用在臨時變數的拷貝,一次用在test的拷貝)。使用g++可能會得到不同的輸出,因為g++對此進行了優化,需要使用引數-fno-elide-constructors。

那麼我們通過實現多乙個函式a(a&& t)來使用右值引用:

class a 

a(const a& t)

a(a&& t)

int* num;

};a get_a()

int main()

輸出結果為:

constructor

move

move

可以看到,使用右值引用,避免了不必要的拷貝構造,而只是將資源(此處為num變數)的歸屬做了調整。

另外,我們還可以使用std::move()函式將左值變為右值來避免拷貝構造。

class a 

a(const a& t)

a(a&& t)

int* num;

};a get_a()

int main()

輸出結果為:

constructor

copy

move

c 左值 右值 右值引用 左值引用

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

c 左值 右值 左值引用 右值引用

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...

C 左值 右值 左值引用 右值引用

就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...