看了这方面的内容,还是一知半解,简单总结一下
左值和右值
简单来讲,左值就是能放在等号左边,也能放在等号右边的值,而右值是只能放在等号右边的值。至于怎么区分,我觉得不需要特意去学习,用得多了自然也就熟悉了。
左值引用
左值引用有两种:左值引用和常左值引用。
- 左值引用&:只能引用左值
- 常左值引用const &:可以引用左值和右值
int x = 1;
int& y0; //编译器报错“引用变量需要初始值设定项”
int& y1 = x; //可以
int& y2 = 1; //编译器报错“非常量引用的初始值必须为左值”
const int& z0; //编译器报错“引用变量需要初始值设定项”
const int& z1 = x; //可以
const int& z1 = 1; //可以
右值引用
- 只能对右值进行引用
注意右值引用等号左边的类型必须是具体的类型,不能是auto或者模板参数T
int x = 1;
int&& a0; //编译器报错“引用变量需要初始值设定项”
int&& a1 = x; //编译器报错“无法将右值引用绑定到左值”
int&& a2 = 1; //可以
const int&& b0; //编译器报错“引用变量需要初始值设定项”
const int&& b1 = x; //编译器报错“无法将右值引用绑定到左值”
const int&& b2 = 1; //可以
万能引用
万能引用可以是左值引用,也可以是右值引用。具体是那种引用是根据引用对象推导出来的。
-
引用对象是左值,该万能引用是左值引用
image.png
-
引用对象是右值,该万能引用是右值引用
image.png -
存在类型推导才是万能引用,也就是有这两种情况是万能引用:一是有auto,二是存在模板参数T
image.png - 万能引用只能推导引用类型,转换成左值引用或右值引用,并不能转换变量值的类型,也就是说不管等号右边的值是左值还是右值,得到等号左边的值永远是左值