我也不是很明白的std::move
功能移動語義的std ::移動
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
爲什麼remove_reference
? 有人可以給我一個簡單的解釋?
我也不是很明白的std::move
功能移動語義的std ::移動
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
爲什麼remove_reference
? 有人可以給我一個簡單的解釋?
想想如果T
是一個左值引用,例如MyClass &
會發生什麼。在這種情況下,T &&
將變爲MyClass & &&
,並且由於參考摺疊規則,這將再次轉換爲MyClass &
。爲了達到正確的結果,typename remove_reference<MyClass&>::type&&
首先從該類型中刪除任何參考修飾,因此MyClass &
映射到MyClass
,然後將右值引用應用於它,產生MyClass &&
。
因爲右值對左值引用的引用會衰減爲左值引用,並且左值引用與您期望從move
得到的值不同。
編輯: 呵呵,爲什麼downvote?看看這個代碼:
template < typename T > T&& func(T&& x) { return x; }
int main()
{
int x;
int &y = func(x);
}
延伸閱讀:http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html
是的,這是完全正確的,但顯然有人不同意:) – 2011-04-03 12:06:43
@讓:你是什麼意思?到目前爲止,我看到我的回答沒有downvote ... – fredoverflow 2011-04-03 12:14:59
嚴。我在10分鐘前寫下了同樣的東西,並投了票。 – 2011-04-03 12:16:03