2012-05-30 37 views
3

在MSVC2010轉移構造爲vector類的定義如下:C++向量執行 - 移動構造函數 - 移動VS向前

vector(_Myt&& _Right) 
    : _Mybase(_Right._Alval) 
    { // construct by moving _Right 
    _Assign_rv(_STD forward<_Myt>(_Right)); 
    } 

這裏還有一個拷貝構造函數的定義,我想我們永遠不會調用vector(_Myt&& _Right)用一個左值引用作爲參數。

所以我如果在這裏想知道,這條線:

_Assign_rv(_STD move<_Myt>(_Right)); 

,無副作用

+0

+1用於探索您的STL。這是艱苦的工作,但理解是有代價的。 –

回答

4

是,對於類型沒有參考預選賽:

_Assign_rv(_STD forward<_Myt>(_Right)); 

可以通過以下方式取代Tstd::forward<T>std::forward<T&&>都只是說std::move的奇特方式。

+0

這是我第一次看到這個斷言,如果真的,它可以澄清許多用例。因此,例如在這個表達式'template fun(T && t){...}'中,'T'保證是「沒有引用限定符」?如果是這樣,爲什麼通常'std :: forward (t)'出現在這些類型函數的主體中(而不是簡單的'std :: move(t)')? – alfC

+1

@alfC不,不能保證「沒有參考限定詞」。如果是的話,那麼右值就被傳入了。如果一個左值被傳入,'T'將會被'U&'和引​​用摺疊'U &&&'變成'U&'。你可以閱讀更多關於這個,如果你搜索「通用引用C++」 –

+0

所以,這是爲什麼,當轉發一個「通用參考」(做完美的向前)有必要與'std :: forward (t) ',(在左值通過的情況下)。 – alfC