右值引用和轉發引用之間的區別作出足夠清楚在這個例子斯科特邁爾斯:這是一個轉發參考?
Widget&& var1 = someWidget; // here, 「&&」 means rvalue reference (1)
auto&& var2 = var1; // here, 「&&」 does not mean rvalue reference (2)
template<typename T>
void f(std::vector<T>&& param); // here, 「&&」 means rvalue reference (3)
template<typename T>
void f(T&& param); // here, 「&&」does not mean rvalue reference (4)
本質上的區別發生時,我們有一個抵扣方面,因此情況(3)明確規定,我們具有vector<...>&&
,而情況(4)中的T
將被推斷並且(在應用參考摺疊規則之後)按照「價值類別」進行分類。
但是,有點複雜的模式匹配會發生什麼?就拿下面的情況:
template <template <class...> class Tuple, class... Ts>
void f(Tuple<Ts...>&& arg)
{
}
是什麼意思&&
這裏?
可推論的上下文並不重要。 (3)和(4)都可以推導出來。 – Oktalist