據http://en.cppreference.com/w/cpp/utility/move爲什麼std :: move使用std :: remove_reference?
std::move
聲明如下:
template <typename T>
std::remove_reference<T>::type&& move(T&& t);
至於我的理解去,當代碼模板的T
在typename T
扣除失去有關參考信息,所以以下內容:
template <typename T>
void someFunction(T&& value);
當使用像:
int five=5;
someFunction(five);
然後
value
是類型的int&
T
是int
或
const float value = 5.25;
someFunction(value);
然後
value
的類型是const float&
T
是const float
。
如果是這樣,那麼在移動聲明沒有一點聲明返回類型爲: std::remove_reference<T>::type&&
,因爲T是已經不是一個引用。另外,如果std::move
以參數(實踐中的l值參考)爲參數,則實際上由於參考摺疊而返回static_cast<T&&>(t)
將返回l值參考或r值參考,因此它將表現更多像std::forward
不動。那麼,什麼是訣竅,它使它正常工作,我不明白?
如果'value'爲'int&','T'必須是'int'。引用崩潰。你不希望這種情況發生在返回類型上,你希望它始終是r值參考。 – LogicStuff
我曾經犯過這個錯誤。多麼尷尬! :-) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377。HTM#返回%20A && –