C 中左值引用與右值引用的區別

2021-10-03 15:15:46 字數 1065 閱讀 3343

首先,左值和右值是表示式的屬性。c++中的表示式,不是左值就是右值。左值可以位於賦值語句的左側,而右值則不能;可以做乙個簡單的歸納:當乙個物件被用作右值的時候,用的是物件的值;當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。需要右值的地方可以用左值代替,但不能把右值當成左值使用。

介紹完左值右值,接下來介紹左值引用和右值引用。

左值引用就是我們平常使用的「引用」。引用是為物件起的別名,必須被初始化,與變數繫結到一起,且將一直繫結在一起。

我們通過 & 來獲得左值引用,可以把引用繫結到乙個左值上,而不能繫結到要求轉換的表示式、字面常量或是返回右值的表示式。舉個例子:

int i =42;

int&r = i;

//正確,左值引用

int&r1 = i *42;

//錯誤, i*42是乙個右值

const

int&r2 = i *42;

//正確,可以將乙個const的引用繫結到乙個右值上

右值引用就是必須繫結到右值的引用,他有著與左值引用完全相反的繫結特性,我們通過 && 來獲得右值引用。右值有乙個重要的性質——只能繫結到乙個將要銷毀的物件上。舉個例子:

int

&&rr = i;

//錯誤,i是乙個變數,變數都是左值

int&&rr1 = i *42;

//正確,i*42是乙個右值

左值擁有持久的狀態,而右值要麼是字面常量,要麼是在表示式求職過程中建立的臨時物件。

右值引用的物件將要被銷毀。不能將乙個右值引用繫結到乙個右值引用型別的變數上,因為變數都是左值。舉個例子:

int

&&rr1 =42;

//正確,42是右值

int&&rr2 = rr1;

//錯誤,rr1是左值!

但是我們可以顯示的將乙個左值轉換成對應的右值引用型別。通過move函式來執行。

int

&&rr3 = std::

move

(rr1)

;

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

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

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

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

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

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