引數轉發
模板可以使用轉發引用接受左值和右值引用 :
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);