什么是右值
Generally, rvalues are values whose address cannot be obtained by dereferencing them, either because they are literals or because they are temporary in nature (such as values returned by functions or explicit constructor calls).
以上是cplusplus.com给出的解释
简单地说,就是立即数,如0,1,100,1.0f,或者临时对象,如”hello”,Class1(), Class2(“a”)
什么是右值引用
在函数间参数传递时,为区分左值引用,使用&&表示右值引用,如以下foo2函数就是使用了右值引用传递参数
`
void foo1(T& t) {
}
void foo2(T&& t) {
}
`
为什么要引入右值引用
有两个目的:
1. 减少不必要的拷贝(如以前发生在拷贝构造函数时的拷贝操作),提升程序运行性能
2. 简化泛型编程,提高编程效率,这一点依赖于采用右值引用实现的完美转发,保证参数在传递的过程中类型不变,如& -> &, const & -> const &, && -> &&
右值引用带来的影响
被右值引用过的变量(使用std::move)不能再使用,因为此时变量的状态不可知,除非重新赋值。
我们需要做什么
- 定义自己的转移构造函数(即以&&为参数的构造函数)
- 使用std::move获取右值引用,更好地利用标准库已经实现的转移构造函数
- 在泛型编程时,使用&&代替各种类型的函数重载