正如@Deduplicator所述,&&
僅表示T
是推導類型的情況下的通用參考。斯科特·邁耶的comprehensive blog post on Universal References提供了一個容易記住的名言:
如果一個變量或參數被聲明爲具有類型T & &一些 推導型T,該變量或參數是一個普遍的參考。
除了作爲一個代碼示例:
Widget&& var1 = someWidget; // here, 「&&」 means rvalue reference
auto&& var2 = var1; // here, 「&&」 does not mean rvalue reference
template<typename T>
void f(std::vector<T>&& param); // here, 「&&」 means rvalue reference
template<typename T>
void f(T&& param); // here, 「&&」does not mean rvalue reference
作爲覆蓋Thomas Becker,std::move
接受通用參考採取完善轉發優勢。
儘管push_back採用T&&
,但這不是一個通用參考,正如Scott Meyers所解釋的。 T
已經推導出在這種情況下:
template <class T>
void vector<T>::push_back(T&& x);
因此參數實際上變成一個右值引用。舉一個實際的例子,認爲不具有重載需要一個左值參考模板類:
template <typename T>
struct Test
{
void push_back(T&& t);
};
template <typename T>
void Test<T>::push_back(T&& t) { std::cout << "rvalue overload.\n"; }
int main()
{
Test<int> t;
t.push_back(42);
int i = 50;
t.push_back(i);
return 0;
}
t.push_back(i)
會給出一個錯誤。
其實,std :: move的大驚小怪。 std :: vector爲此目的具有emplace_back – 2014-10-19 00:22:35
實際上,'std :: move'不是一個右值引用,而是一個轉發引用(又名通用引用),這意味着它可以是左值和右值引用。 – Deduplicator 2014-10-19 00:24:26
@remyabel什麼是「崩潰規則」? – Hei 2014-10-19 00:25:13