完美的轉發

完美轉發需要轉發引用以保留引數的 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);