相关定义
左值:可以放在“=”的左右两边,变量等
右值:只能放在“=”的右边,常量值、函数返回值、lambda表达式
纯右值:临时变量,不与对象关联
将亡值:将要被移动的对象
引用:即变量的别名,公用一块内存;可减少赋值操作
左值引用:对一个左值进行引用的类型,即传统的引用 &
右值引用:右值引用就是对一个右值进行引用的类型,符号 &&
右值引用
左值引用即为常见的引用,不再过多介绍。
概念:
右值引用直接移动给左值对象,是减少拷贝,提高程序效率。
特点:
通过右值引用的声明,右值又“重获新生”,其生命周期与右值引用类型变量的生命周期一样长,只要该变量还活着,该右值临时量将会一直存活下去
右值引用独立于左值和右值。意思是右值引用类型的变量可能是左值也可能是右值
T&& t在发生自动类型推断的时候,它是左值还是右值取决于它的初始化。
移动语义std::move
举例: v2=v1; // v2复制了v1的内容 v3 = std::move(v1); // 将v1内容移动给v3, v1销毁
C++11的移动构造函数即调用了move方式,将左值强制转换为右值;
完美转发 std::forward
在前面说到一个特点,即会自动类型判断。其类型推导规则如下:
完美转发:通过一个函数将参数继续转交给另一个函数进行处理,原参数可能是右值,可能是左值,如果还能继续保持参数的原有特征,那么它就是完美的。
参考modern C++
结果
总结:
1、右值引用,减少拷贝的空间 2、std::move 可以实现左值强制转换为右值 3、std::forwad实现完美转发,避免参数传递过程中左值和右值变化。