1.左值引用与右值引用
c++中有左值与右值的概念
一般认为可以取地址的是左值,反之是右值

通常我们可以像这样定义一个引用
int a=1;int &b=a;
此时引用指向一个左值,该引用是一个左值引用
如果使用int &b=1;就会报错
c++还允许使用引用指向右值,即所谓的右值引用
class A{};
int &&b=1;
int &&c=A();//指向一个A类的临时变量
右值引用延长了临时变量的生存时间
2.为什么要引入右值引用
首先回到我们使用左值引用的场景

很多时候我们会将引用作为函数的参数,这样就可以避免调用构造函数,然而这样的方式不适用于
传入一个临时变量

因为1是右值
右值引用使得我们可以传入一个临时变量作为实参。
因为临时变量生存时间很短,实际上每次用完马上就销毁是比较浪费资源的,使用右值引用既可以解决值传递浪费资源的问题,又突破了左值引用只能传左值的限制
右值引用本身是左值还是右值?

常量左值引用既可以指向左值也可以指向右值

3.移动构造函数
通常的复制构造函数是进行一个深拷贝,而移动构造函数是用自己的指针直接指向被复制对象的指针,看上去就像浅拷贝一样,但是他会将被复制对象的指针归零。是一个抢占指针的过程,避免了浅拷贝可能导致的指针悬挂。在很多时候移动构造函数避免了复制构造函数带来的额外的开销。



4.move
move可以将一个左值转为右值

5.完美转发
还记得前面提到的右值引用本身是左值吗
这就导致了,当传入一个右值给右值引用作为参数后,右值引用这个形参本身是左值,当他在作为实参调用其他函数时调用的是左值作为参数的函数。这就产生了不完美转发。

如何解决:
调用forward函数,forward函数会将其转为右值
