简单理解
左值相当于地址值
右值相当于数据值。右值指的是引用了一个存储在某个内存地址里的数据。
- L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.
- R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.
左值和右值是相对于赋值表达式而言的。左值是能出现在赋值表达式左边的表达式。左值表达式可以分为可读写的左值和只读左值。右值是可以出现在赋值表达式右边的表达式,他可以是不占据内存空间的临时量或字面量,可以是不具有写入权的空间实体
int a=1;// a为左值,1为右值
const int b=5;
a=b+2; //a是左值,b+2是右值
b=a+2; //错!b是只读的左值但无写入权,不能出现在赋值符号左边
(a=4)+=28; //a=4是左值表达式,28是右值,+=为赋值操作符
34=a+2; //错!34是字面量不能做左值
右值引用
通过&&获取右值,右值一般表示的是对象的值
int i=42;
int &r=i; //正确,r引用i
int &&rr=i //错误,不能将一个右值引用绑定到一个左值上
int &r2=i*42; //错误,i*42是一个右值
const int &r3=i*42; //正确,我们可以将一个const的引用绑定到一个右值上
int &&r2=i*42; //正确,将rr2绑定到乘法结果上
移动
右值的接管通过 std::move()来实现右值的