T&&
被称作万能引用。万能引用会在两种场景下出现,一种是函数模板形参:
template<typename T>
void f(T&& param);
第二个场景是 auto
声明:
auto&& var2 = var1;
这两个场景的共同之处,在于它们都涉及类型推导。
如果没有涉及到类型推导,那么它就是右值引用。且该形式被限定的很死,必须形如 T&&
:
template<typename T>
void f(std::vector<T>&& param); // 右值引用
template<typename T>
void f(const T&& param); // 右值引用
类模板的模板参数不涉及类型推导,所以不是万能引用:
template<class T, class Allocator = allocator<T>>
class vector {
public:
void push_back(T&& x); // 右值引用
...
};
作为对比,成员函数 emplace_back
却会发生类型推导:
template<class T, class Allocator = allocator<T>>
class vector {
public:
template <class... Args>
void emplace_back(Args&&... args); // 万能引用
...
};
C++14中lambda表达式允许使用 auto&&
类型形参:
auto timeFuncInvocation =
[](auto&& func, auto&&... params)
{
std::forward<decltype(func)>(func)(
std::forward<decltype(params)>(params)...
);
};