目錄
(1)為何要區分?
(2)那什麼是左值/右值引用?
(3)左值?右值?
(4)左值/右值,與左值/右值引用有什麼區別?
引用的型別是左值/右值,指明了其繫結的物件的狀態是仍有可能被使用,or不再被修改、使用甚至被銷毀。而物件的狀態(左值/右值)又可決定,如何「拷貝」物件所擁有的動態資源——拷貝or接管。這一操作依賴類內的拷貝/移動建構函式以及拷貝/移動賦值運算子。下面以vector舉例,窺探物件的狀態(左值/右值)對「拷貝」物件這一操作的影響:
#define hugenum 1000000000 //10億
int main()
執行結果如下:
可見,對於擁有動態資源的物件,其狀態(左值/右值)決定了其被「拷貝」時的具體實現,而當物件擁有大量的動態資源時,這一實現會影響到執行效率。
形式上,定義引用時有乙個&修飾符的則為左值引用,有兩個&修飾符的則為右值引用。左值/右值引用必須繫結對應狀態的物件,如下:
---- 右值引用只能繫結到右值物件上;左值可位於賦值號的左側和右側,可定址,其值既能被使用也能被修改。而右值只能位於賦值號右側,不可定址,可使用而不可修改其值。---- 非const左值引用只能繫結到左值物件上,而const左值引用對於左值/右值物件均能繫結。(const左值引用無法修改其繫結的物件,這符合右值的設計理念)
常見左值包括:定義的物件、引用(不論左值/右值)、賦值/下標/解引用/前置自增自減等運算子返回的值,以及返回型別為引用型別的函式所返回的值;常見右值包括:字面值常量、算數/關係/邏輯/位等運算返回的值、後置自增自減運算子返回的值,以及返回型別為非引用型別的函式所返回的值。
---- 左值/右值引用本身屬於左值,既能使用也能修改其繫結的物件的值。但我們在使用右值引用時,還是應該遵循右值的設計理念,即假設右值引用繫結的物件不會再被修改、使用,甚至可能立刻被銷毀;---- 右值引用繫結的既可能是真實的右值如(3)所述,也可能是我們希望是右值但實際並不是的普通物件(利用std::move()轉換)。
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...
C 左值 右值 左值引用 右值引用
就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...