看了這方面的內(nèi)容,還是一知半解,簡單總結(jié)一下
左值和右值
簡單來講,左值就是能放在等號左邊,也能放在等號右邊的值,而右值是只能放在等號右邊的值。至于怎么區(qū)分,我覺得不需要特意去學習,用得多了自然也就熟悉了。
左值引用
左值引用有兩種:左值引用和常左值引用。
- 左值引用&:只能引用左值
- 常左值引用const &:可以引用左值和右值
int x = 1;
int& y0; //編譯器報錯“引用變量需要初始值設(shè)定項”
int& y1 = x; //可以
int& y2 = 1; //編譯器報錯“非常量引用的初始值必須為左值”
const int& z0; //編譯器報錯“引用變量需要初始值設(shè)定項”
const int& z1 = x; //可以
const int& z1 = 1; //可以
右值引用
- 只能對右值進行引用
注意右值引用等號左邊的類型必須是具體的類型,不能是auto或者模板參數(shù)T
int x = 1;
int&& a0; //編譯器報錯“引用變量需要初始值設(shè)定項”
int&& a1 = x; //編譯器報錯“無法將右值引用綁定到左值”
int&& a2 = 1; //可以
const int&& b0; //編譯器報錯“引用變量需要初始值設(shè)定項”
const int&& b1 = x; //編譯器報錯“無法將右值引用綁定到左值”
const int&& b2 = 1; //可以
萬能引用
萬能引用可以是左值引用,也可以是右值引用。具體是那種引用是根據(jù)引用對象推導出來的。
-
引用對象是左值,該萬能引用是左值引用
image.png
-
引用對象是右值,該萬能引用是右值引用
image.png -
存在類型推導才是萬能引用,也就是有這兩種情況是萬能引用:一是有auto,二是存在模板參數(shù)T
image.png - 萬能引用只能推導引用類型,轉(zhuǎn)換成左值引用或右值引用,并不能轉(zhuǎn)換變量值的類型,也就是說不管等號右邊的值是左值還是右值,得到等號左邊的值永遠是左值


