網(wǎng)站集約化建設(shè)情況匯報網(wǎng)絡(luò)營銷咨詢服務(wù)
1 左值和右值
簡單記法:能取地址的是左值,不能取地址的是右值
右值一般是常量
例:
i ++
是右值,因為先把 i
賦值給臨時變量,臨時變量在+1,而臨時變量是將亡值,&i++
取地址會報錯
++ i
是左值,因為自身+1,本身是左值,&++i不會報錯
這里需要注意的是,字符串常量是特例,字符串常量也是左值,可以取地址,而數(shù)字常量則是右值
左值引用
左值引用:常用于拷貝構(gòu)造提高效率,因為減少了臨時變量的拷貝過程
例:
雖然下邊代碼沒什么實際意義
但第一句執(zhí)行后,因為是引用,生命周期會延長
而第二句執(zhí)行后,右值11應(yīng)該被銷毀
const int &t = 11
const int t = 11
右值引用
1、延長右值生命周期
例:
X make_x(){return X();
}
int main(){X &&x = make_x();
}
如果不是右值引用,因為函數(shù)返回值本身是右值,X()默認構(gòu)造一次,然后return X()時再拷貝一份給返回值,返回值再拷貝給main中的變量,經(jīng)過1次構(gòu)造和2次拷貝構(gòu)造
而如果直接使用右值引用,直接延長返回值的生命周期,提高性能,在大內(nèi)存情況下,優(yōu)化效果較為明顯