2011-07-28 93 views

回答

29

在你的具體情況下,沒有任何區別。

詳細答案:

引擎蓋下,std::move(t)確實static_cast<typename std::remove_reference<T>::type&&>(t),其中Tt類型(見§20.2.3/ 6)。在你的情況下,它解決爲static_cast<int&&>(nb)

forward有點棘手,因爲它是爲了在模板中使用而設計的(爲了實現完美的轉發)而不是將左值轉換爲右值引用的工具。

標準庫提供了兩個重載(一個用於左值的引用,第二個右值的,見§20.2.3/ 2):

template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; 
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; 

int,我們得到:

int&& forward(int& t) noexcept; 
int&& forward(int&& t) noexcept; 

由於nb是左值,因此選擇了第一個版本。根據標準草案,forward的唯一影響是static_cast<T&&>(t)Tint,我們得到static_cast<int&&>(nb),即 - 我們得到兩個完全相同的演員。

現在,如果您想將左值轉換爲右值(以允許移動),請僅使用std::move,這是執行此轉換的慣用方式。 std::forward不打算以這種方式使用。

1

沒有區別。