在前面的文章讲了很多万能引用,形式如"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;