声明一个右值引用,使用T&&
这种格式,但是这玩意并不是表面上看到的那么简单。
1
2
3
4
5
6
7void f(Widget&& param); // 右值引用
Widget&& var1 = Widget(); // 右值引用
auto&& var2 = var1; // 通用引用
template<typename T>
void f(std::vector<T>&& param); // 右值引用
template<typename T>
void f(T&& param); // 通用引用
T&&
的意义
T&&
实际上具有两种意义:
- 一种意义是其代表的是右值引用,具有满足移动语义的可能性
- 一种意义是它既可以是右值引用,也可以是左值引用。它可以绑定多种类型
const
或非const
,volatile
或非volatile
等等,所以也将其称为通用引用。
通用引用
通用引用出现在两种场合。
一种是作为函数模板的参数:
1 | template<typename T> |
一种是使用auto
做推导时:
1 | auto&& var2 = var1; // var2 is a universal reference |
可以看到,通用引用都是出现在有推导的情况下,也就是说它们到底最终是左右还是右值引用,得要更具传入的参数或给其赋值的对象而决定:
1 | Widget w; |
需要注意的是:通用引用必须要严格遵从T&&
的格式。
>
auto
也是同理,遵从auto&&
格式,也是通用引用。
比如以下两种都是右值引用:
1 | template<typename T> |
由于push_back
并没有推导过程,所以其不是通用引用,但是emplace_back
因为有推导过程,所以它是通用引用:
1 | template<class T, class Allocator = allocator<T>> // still from |