这里的移动和前进之间存在差异:
void test(int && val)
{
val=4;
}
void main()
{
int nb;
test(std::forward<int>(nb));
test(std::move(nb));
std::cin.ignore();
}
答案 0 :(得分:29)
在您的具体情况下,不,没有任何区别。
详细答案:
在幕后,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
不打算以这种方式使用。
答案 1 :(得分:2)
没有区别。