有舉措,在這裏向前之間的區別:的std ::前鋒VS的std ::移動,同時結合對左值右值參考
void test(int && val)
{
val=4;
}
void main()
{
int nb;
test(std::forward<int>(nb));
test(std::move(nb));
std::cin.ignore();
}
有舉措,在這裏向前之間的區別:的std ::前鋒VS的std ::移動,同時結合對左值右值參考
void test(int && val)
{
val=4;
}
void main()
{
int nb;
test(std::forward<int>(nb));
test(std::move(nb));
std::cin.ignore();
}
在你的具體情況下,沒有任何區別。
詳細答案:
引擎蓋下,std::move(t)
確實static_cast<typename std::remove_reference<T>::type&&>(t)
,其中T
是t
類型(見§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)
。 T
爲int
,我們得到static_cast<int&&>(nb)
,即 - 我們得到兩個完全相同的演員。
現在,如果您想將左值轉換爲右值(以允許移動),請僅使用std::move
,這是執行此轉換的慣用方式。 std::forward
不打算以這種方式使用。
沒有區別。