参数转发
模板可以使用转发引用接受左值和右值引用 :
template <typename T>
void f(T &&t);
在这种情况下,将根据上下文推导真实类型的 t:
struct X { };
X x;
f(x); // calls f<X&>(x)
f(X()); // calls f<X>(x)
在第一种情况下,类型 T 被推断为 X (X&)的参考,t 的类型是对 X 的左值参考,而在第二种情况下,T 的类型推导为 X,t 的类型推导为 rvalue 参考到 X (X&&)。
注意: 值得注意的是,在第一种情况下,decltype(t) 与 T 相同,但不在第二种情况下。
为了将 t 完美地转发到另一个函数,无论是左值还是左值引用,都必须使用 std::forward:
template <typename T>
void f(T &&t) {
g(std::forward<T>(t));
}
转发引用可以与可变参数模板一起使用:
template <typename... Args>
void f(Args&&... args) {
g(std::forward<Args>(args)...);
}
注意: 转发引用只能用于模板参数,例如,在以下代码中,v 是一个右值引用,而不是转发引用:
#include <vector>
template <typename T>
void f(std::vector<T> &&v);