条款24:区分万能引用和右值引用
万能引用既可以是左值引用,也可以是右值引用。
一、模板中的万能引用
要求:T &&
+ 类型推导。
template<typename T>
void f(T &¶m); // param是一个万能引用template<typename T>
void f(std::vector<T> &¶m); // 右值引用,因为不是形如 T &&// std::vector内的push_back成员函数
void push_back(T &&x); // 右值引用,因为不涉及类型推导,vector实例的类型已经确定了push_back的参数类型
用左值初始化万能引用就会得到一个左值引用,用右值初始化万能引用就会得到一个右值引用。
二、可变参数模板的万能引用
要求:Args&&...
+ 类型推导
// std::vector的emplace_back
template<class... Args>
void emplace_back(Args&&... args);
// 万能引用,因为类型形参Args独立于vector的类型形参T,每次emplace_back的时候都要进行推导
三、auto的万能引用
要求:auto&&/auto&&...
+ 类型推导
auto &&var2 = var1;