C 右值引用

2022-09-24 04:09:09 字數 1413 閱讀 4152

1 左值是表示式結束後依然存在的持久物件

2 右值是表示式結束後不再存在的臨時物件

簡單來說,能取位址的是左值,否則就是右值。

實現移動語義完美**

c++11的右值引用和std::move可以實現移動語義,通過減少拷貝操作提公升效率

class a

a(size_t size): size(size)

a(const a& rhs)

於是通過std::move將源資料轉化為右值後就會呼叫相應的移動建構函式。

int main()

首先看第乙個例子:

#includeusing namespace std;

int main()

在上面的**中,被宣告的左值引用和右值引用都是左值,是可以輸出它們的位址的。

然後看二個例子:

#includeusing namespace std;

void func(int& x);

// 特化版本

templatestruct remove_reference<_tp&>;

templatestruct remove_reference<_tp&&>

;

std::forward 原始碼

templateconstexpr _tp&&

forward(typename std::remove_reference<_tp>::type& __t) noexcept

根據上述原始碼,首先通過remove_reference獲取 _tp 的型別 type,然後宣告左值引用變數 __t 。

根據 _tp 的不同,_tp 會發生引用摺疊:

當 _tp 為左值引用時,_tp摺疊為左值引用

當 _tp 為右值引用時,_tp摺疊為右值引用

可以發現當 std::forward 的輸入是左值引用時,輸出也是左值引用;輸入是右值引用時,輸出也是右值引用。

在下面的**中,使用了 std::forward 之後就會輸出右值。

#includeusing namespace std;

void func(int& x)

int main()

references:

一文帶你詳細介紹c++中的std::move函式

c++ 理解std::forward完美**

一文讀懂c++右值引用和std::move

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

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

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

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

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

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