模板可以使用转发引用接受左值引用和右值引用:
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的类型将int作为对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);