std :: forward vs std :: move将左值绑定到右值引用

时间:2011-07-28 19:57:17

标签: c++ c++11

这里的移动和前进之间存在差异:

void test(int && val)
{
    val=4;
}

void main()
{  
    int nb;
    test(std::forward<int>(nb));
    test(std::move(nb));
    std::cin.ignore();    
}

2 个答案:

答案 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)。当Tint时,我们得到static_cast<int&&>(nb),即 - 我们得到两个完全相同的演员。

现在,如果你想将左值转换为右值(以允许移动),请仅使用std::move,这是执行此转换的惯用方法。 std::forward不打算以这种方式使用。

答案 1 :(得分:2)

没有区别。