完美的轉發
完美轉發需要轉發引用以保留引數的 ref 限定符。此類引用僅出現在推斷的上下文中。那是:
template<class T>
void f(T&& x) // x is a forwarding reference, because T is deduced from a call to f()
{
g(std::forward<T>(x)); // g() will receive an lvalue or an rvalue, depending on x
}
以下不涉及完美轉發,因為 T
不是從建構函式呼叫中推匯出來的:
template<class T>
struct a
{
a(T&& x); // x is a rvalue reference, not a forwarding reference
};
Version >= C++ 17
C++ 17 將允許推斷類别範本引數。上例中的 a
的建構函式將成為轉發引用的使用者
a example1(1);
// same as a<int> example1(1);
int x = 1;
a example2(x);
// same as a<int&> example2(x);