2016-02-08 80 views
0

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); 

至於我的理解去,當代碼模板的Ttypename T扣除失去有關參考信息,所以以下內容:

template <typename T> 
void someFunction(T&& value); 

當使用像:

int five=5; 
someFunction(five); 

然後

  • value是類型的int&
  • Tint

const float value = 5.25; 
someFunction(value); 

然後

  • value的類型是const float&
  • Tconst float

如果是這樣,那麼在移動聲明沒有一點聲明返回類型爲: std::remove_reference<T>::type&&,因爲T是已經不是一個引用。另外,如果std::move以參數(實踐中的l值參考)爲參數,則實際上由於參考摺疊而返回static_cast<T&&>(t)將返回l值參考或r值參考,因此它將表現更多像std::forward不動。那麼,什麼是訣竅,它使它正常工作,我不明白?

+1

如果'value'爲'int&','T'必須是'int'。引用崩潰。你不希望這種情況發生在返回類型上,你希望它始終是r值參考。 – LogicStuff

+0

我曾經犯過這個錯誤。多麼尷尬! :-) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377。HTM#返回%20A && –

回答

7

你的例子是不正確的:

int five=5; 
someFunction(five); 

在這種情況下,T推導爲int&,不int。第二個例子也是如此; T推導爲const int&

因此,返回T&&將意味着T&& &,這是由於參考摺疊規則造成的T&

這就是爲什麼std::remove_reference是必需的,以確保沒有引用類型以防止引用崩潰發生。

+0

這將是T,然後,如果我下面有一個函數:?? 模板 void函數(T&A,T && b); – DawidPi

+0

@DawidPi並傳遞什麼給它 – TartanLlama

+0

對,沒錯對不起,詮釋A,B ,函數(a,std :: move(b)); – DawidPi

相關問題