在前面的文章讲了很多万能引用,形式如"T&&",但右值引用也可以这样表示,具体什么样的才是万能引用呢?

万能引用必须涉及型别推导,且参数形式必须为“T&&”,不能带有任何其他修饰关键字(const、volatile),不是万能引用就是右值引用

template <class T>
void f(T&& param);  //param是一个万能引用

auto&& var1 = var2; //var1是一个万能引用,只要是auto&&型别的都是万能引用


void f(Widget&& param);  //param是一个右值引用,因为param不涉及型别推导

template <class T>
void f(std::vector<T>&& param);  //param是一个右值引用,类型为std::vector<T>&&,不是T&&

template <class T>
void f(const T&& param);  //param是一个右值引用,类型为const T&&,不是T&&

还有一种很隐蔽的场景,也会常常被错认为为万能引用:

template <class T>
class myVector{
public:
    //此时param是右值引用,而非万能引用
    //因为在调用该函数时,对象的类型已经确定,此处不涉及型别推导
    void push_back(T&& param);

};

myVector<Widget> vec;