右值引用

318 阅读2分钟

相关定义

左值:可以放在“=”的左右两边,变量等
右值:只能放在“=”的右边,常量值、函数返回值、lambda表达式
        纯右值:临时变量,不与对象关联
        将亡值:将要被移动的对象
引用:即变量的别名,公用一块内存;可减少赋值操作
左值引用:对一个左值进行引用的类型,即传统的引用  &
右值引用:右值引用就是对一个右值进行引用的类型,符号 &&

右值引用

左值引用即为常见的引用,不再过多介绍。

概念:

右值引用直接移动给左值对象,是减少拷贝,提高程序效率。

特点:

通过右值引用的声明,右值又“重获新生”,其生命周期与右值引用类型变量的生命周期一样长,只要该变量还活着,该右值临时量将会一直存活下去
右值引用独立于左值和右值。意思是右值引用类型的变量可能是左值也可能是右值
T&& t在发生自动类型推断的时候,它是左值还是右值取决于它的初始化。

移动语义std::move

举例: v2=v1; // v2复制了v1的内容 v3 = std::move(v1); // 将v1内容移动给v3, v1销毁

C++11的移动构造函数即调用了move方式,将左值强制转换为右值;

完美转发 std::forward

在前面说到一个特点,即会自动类型判断。其类型推导规则如下:

image.png 完美转发:通过一个函数将参数继续转交给另一个函数进行处理,原参数可能是右值,可能是左值,如果还能继续保持参数的原有特征,那么它就是完美的。 参考modern C++

image.png

结果

image.png

总结:

1、右值引用,减少拷贝的空间 2、std::move 可以实现左值强制转换为右值 3、std::forwad实现完美转发,避免参数传递过程中左值和右值变化。

参考

1、changkun.de/modern-cpp/… 2、www.jianshu.com/p/d19fc8447…