一 左右值的概念和区别
1.概念
左值:左值是一个表示数据的表达式,比如:变量名,解引用的指针变量。一般的,我们可以获取它的地址,对他赋值。但是如果被const修饰以后就不能对它赋值,但是可以获取地址。左值可以出现在赋值符号左边也可以出现在赋值符号右边。
以下a,*p,b都是左值
int a=3;
int*p=&a;
const int b=2;
右值:右值是一个表示数据的表达式,比如:字面常量,表达式返回值,传值返回函数的返回值。注意,右值不能出现在赋值符号左边,只能出现在右边,也不能对它进行取地址。
以下都是右值
int x=3,y=4;
10;//常量
x+y;//表达式返回值
fun(x,y);//传值返回函数的返回值
2.区别
区分左值和右值,还是要看能否取地址。左值可以对其取地址,右值不能对其取地址。
二 左值引用与右值引用
1.左值引用
左值引用就是对左值的引用,给左值取别名,通过&来声明
以下是对上面左值的左值引用
int&q=a;
int&r=*p;
const int &z=b;
2.右值引用
右值引用就是对右值的引用,给右值取别名,通过&&来声明
一下是对上面右值的右值引用
int&& a1=10;
int&& a2=x+y;
int&& a3=fun(x,y);
三 对比与总结
左值可读可写,右值可读不可写。所以左值引用不能引用右值,这会使权限放大。但是const修饰左值时,就可以保证被引用的数据不会被修改,所以const左值引用可以引用右值
int a=10;
const int ca=20;
const int& b=a;//const引用,引用普通左值
const int& c=ca;//const引用,引用const左值
const int& d=30;//const引用,引用右值
cout << b <<","<< c <<","<< d <<endl;//都能读
而右值引用只能引用右值,不能引用左值以及const左值
右值不可以取地址,但是右值取别名后,会导致右值被存储到特定位置,且可以取到该位置的地址,就可以对其进行修改
int&& e=a;//error,右值引用,不能引用左值
int&& f=ca;//error,右值引用,不能引用const左值
int&& g=30;//右值引用,引用右值
g=300;//右值引用,可以修改
cout << g <<endl;//300