C++ 参数转发

示例

模板可以使用转发引用接受左值引用和右值引用

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);