1、左值(lvalue):
可以长时间保存,可以存在于=左边的值,可以取地址;
2、右值(rvalue):
临时值,不能存在于=左边的值,不可以取地址。
常见的右值有:
1. 常量、临时变量(函数返回的临时对象).
2. 将亡值:生命周期即将结束
3. 匿名对象:创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量
左值和右值的区别:
左值引用:左值引用得到的就是还是一个左值
1 .左值可以寻址,而右值不可以。
2 .左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。
3 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。
左值引用:
左值引用实际上是一种隐式的指针,它为对象建立一个别名,通过操作符&来实现,即一个&符号后面跟上一个变量名。
左值引用:引用的实体既可以是左值,也可以为右值
左值引用符号为 &
右值引用:
右值引用就是把右值变成左值,通常是在C++返回值上,对于自定子类的重复拷贝做了重要改善,大大提高了C++的效率。
右值引用:引用的实体只能是右值,不能引用左值
右值引用符号为 & &
右值引用操作符为 “&&”;
右值引用得到的是一个左值。
右值引用通常将一个临时变量拿过来用。
右值引用最主要的功能是解决的是自定义类重复构造冗余的问题。
虽然说右值引用不能引用左值,但是move函数可以实现
int a = 3;
int &&t = std::move(a);
右值引用有什么用呢?
根本目的是为了提高效率,减少调用函数的时的构造和析构
当我们调用一个返回一个右值的函数ReturnValue()时,当函数返回后,函数返回的右值生命周期也就结束了。
当我们使用T a = ReturnValue();
这样的方式来接收时,会多一次对象的构造和析构,首先用函数返回值构造a,然后函数返回值生命期结束析构。
但是当我们通过一个右值引用(如 T&& a = ReturnValue(); )来接收时,该右值有重新获生命,
右值引用直接绑定了函数返回的右值,只要我们的右值引用a存在,该右值也同时存在,
那我们再返回时就不需要再进行多余的构造和析构,从而减少了构造和析构的调用次数,提高了效率