引數轉發

模板可以使用轉發引用接受左值和右值引用

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 被推斷為 XX&)的參考,t 的型別是對 X左值參考,而在第二種情況下,T 的型別推導為 Xt 的型別推導為 rvalue 參考到 XX&&)。

注意: 值得注意的是,在第一種情況下,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);