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 語法做的優化,引用的本質還是靠指標...