C 左值引用與右值引用

2021-08-23 12:06:19 字數 949 閱讀 7682

我們平常說的引用,一般來說都會預設為左值引用。即為某乙個物件起一別名,是間接訪問的一種實現方式。

引用有許多的作用,例如傳參中避免發生拷貝,在一定程度上我們可以提公升效能。又例如傳參時,實參為陣列,我們知道陣列是不能整體拷貝,故我們也可以通過引用來實現。

左值,右值

左值,右值都是表示式的屬性。c++中的表示式要麼是右值,要麼是左值。而c++中某一表示式是左值還是右值?總的來說應該根據該表示式所起的作用來決定,如果該表示式的求值結果代表的是物件的身份(在記憶體中的位置),則該表示式是左值屬性。如果該表示式的求值結果是乙個值,則是右值屬性。

那麼,有左值引用,為什麼又需要右值引用呢?

引入右值引用,是為了支援移動操作,避免拷貝。

例如我們現在實現乙個自己設計乙個類,其中成員函式包括push_back函式。

資料成員data為:

std::shared_ptr> data;

成員函式:

void push_back(const t& t)

如果此時我們呼叫push_back(520)

520為字面常量,左值引用不能繫結到字面常量,故在此時會產生乙個臨時物件來儲存這個字面常量,之後左值引用才能繫結到該臨時物件。

因此我們應當過載乙個右值繫結型別的函式,從而能直接實現右值繫結到字面常量,避免不必要的開銷,提高效率。

void push_back(t &&t)

其中std::move是專用於將給定的左值轉換為對應的右值引用型別。

要注意,如果呼叫了std::move函式後,除了對原物件賦值或者銷毀它以外,已經不能再使用它了。例如

std::string str="hello";

a.push_back(std::move(str));

std::cout《此時str是乙個空字串了,已經不能再使用了。

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

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

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

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

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

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