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

2021-07-30 03:49:52 字數 2227 閱讀 8927

2015-06-01 15:07

404人閱讀收藏 

舉報

c++11(5)

一、c++中的左值和右值

誤區:左值位於等號左邊,右值位於等號右邊。

c++11中的定義:左值表示式表示的是乙個物件的身份(在記憶體中的位置),而右值表示式表示的是物件的值(內容)。

左值和右值都是針對表示式而言的,左值是持久的,右值是短暫的:左值在表示式結束後仍然存在,右值在表示式結束後會被銷毀。

注意:在需要右值的地方可以用左值來代替,但是不能把右值當成左值(也就是位置)使用。

例子:若有如下定義:

[cpp]view plain

copy

inta = 10;  

intb = 20;  

int*p = &a;  

vector

> t;  

t.pushback(1);  

string s1 = 「hello」;  

string s2 = "world"

;  const

int&m =1;  

問:a,b,a+b,a++,++a,p,*p,t[0],100,string("hello"),s1,s1+s2,m分別是左值還是右值?

答:a,b是變數,變數可以看做只有運算物件而沒有運算子的表示式,變數表示式都是左值。事實上,變數a,b均是長久的,在生命週期結束才被銷毀,且我們能夠對a,b進行取位址操作。故a,b均為左值。

a+b是臨時變數,在該表示式結束時就被摧毀,且不能對其進行取位址操作,因此a+b為右值。

a++的作用機理是先將a的值拷貝到乙個臨時變數中,然後將這裡臨時變數加1,最終返回的是這個臨時變數,因此a++為右值。

++a的作用機理是在原資料a上直接加1,最終返回的是原來的那個物件(只不過值加了1),因此++a為左值。

p表示的是指向a的指標,它也是長久的,並且我們能對其進行取位址操作,得到的是指向a的指標的位址。因此p為左值。

*p與a等價,也為左值。

t[0]返回容器t中第乙個元素的引用,這是乙個int型變數,是長久的,並且能對其進行取位址操作,因此t[0]為左值。

100是個常量,在使用過後就會銷毀,並且不能對其進行取位址操作,因此100為右值。

string("hello")與100類似,也是個常量,在使用過後就會銷毀,並且不能對其進行取位址操作,因此string("hello")為右值。

s1是string型別的變數,與a,b類似,是長久的,並且可以進行取位址操作。因此s1是左值。

s1+s2與a+b類似,是臨時變數,在表示式結束就被摧毀,並且不能對其進行取位址操作。因此s1+s2是右值。

m是乙個常量型別1的const左值引用,但它本身是乙個變數表示式,因此m是左值。

二、左值引用和右值引用

左值引用符:&

右值引用符:&&

左值引用不能繫結到右值物件上,右值引用也不能繫結到左值物件上。

由於右值引用只能繫結到右值物件上,而右值物件又是短暫的、即將銷毀的。也就是說右值引用有乙個重要性質:只能繫結到即將銷毀的物件上。

左值、右值引用的幾個例子:

[cpp]view plain

copy

inti = 42;

//如前所述,i是乙個左值物件

int&r = i;

//正確,左值引用繫結到左值物件i

int&&rr = i;

//錯誤,右值引用繫結左值物件

int&r2 = i * 42;

//錯誤,如前所述i*42是臨時變數,是右值,而&r2是左值引用

int&&rr2 = i * 42;

//正確,右值引用繫結右值物件

注意:以上繫結規則有乙個例外,如果左值引用是const型別的,則其可以繫結到右值物件上。

[cpp]view plain

copy

const

int&r3 = i * 42;

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

對於乙個左值,若想使用其右值引用,我們可以用move函式:

[cpp]view plain

copy

int&&rr3 = std::move(rr1);

//正確,顯式使用rr1的右值引用

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

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...

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

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...

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

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...