左值/右值
<C Prime Plus>中,左值的定義為:用于標(biāo)識一個特定的數(shù)據(jù)對象(泛指數(shù)據(jù)存儲區(qū))的名字或表達(dá)式.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 可修改的左值:指能被修改的數(shù)據(jù)對象.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 右值:能賦給可修改的左值的量.
個人理解:c中,能在賦值等號左邊又能在右邊的叫做左值,只能出現(xiàn)在右邊的叫做右值.左值能在程序中尋址尋值,右值無法取其地址(不完全對).
? ? ? ? ? ? ? ? C++中,每個表達(dá)式都會產(chǎn)生一個左值或者右值,相應(yīng)的,產(chǎn)生左值的叫做左值表達(dá)式,產(chǎn)生右值的叫做右值表達(dá)式.左值在表達(dá)式結(jié)束后依然存在,右值在表達(dá)式結(jié)束后會被銷毀.
int a = 10; int b = 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為左值
(1)對于基礎(chǔ)類型,右值無法被修改,也無法被const,volatile修飾(與c相同);
(2)對于自定義類型,右值卻允許被通過它的成員函數(shù)進(jìn)行修改.(原因:自定義類型允許有成員函數(shù)富腊,而通過右值調(diào)用成員函數(shù)是被允許的汁咏,但成員函數(shù)有可能不是 const 類型,因此通過調(diào)用右值的成員函數(shù),也就可能會修改了該右值)
左值引用/右值引用
左值引用的基本語法:Type &引用名 = 左值表達(dá)式;
右值引用的基本語法:Type &&引用名 = 右值表達(dá)式;
int a = 10;??
int &&ra(a+1);
例外:如果左值引用是const類型的,則其可以綁定到右值對象上捣卤。
const int &r3 = i * 42;//正確,我們可以將一個const的引用綁定到一個右值對象上
例外:對于一個左值八孝,若想使用其右值引用董朝,我們可以用move函數(shù):
int &&rr3 = std::move(rr1);//正確,顯式使用rr1的右值引用