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

Posted

技术标签:

【中文标题】std::forward vs std::move 同时将左值绑定到右值引用【英文标题】:std::forward vs std::move while binding lvalue to rvalue reference 【发布时间】:2011-07-28 19:57:16 【问题描述】:

这里的move和forward有区别吗:

void test(int && val)

    val=4;


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

【问题讨论】:

【参考方案1】:

在您的具体情况下,不,没有任何区别。

详细回答:

在底层,std::move(t)static_cast&lt;typename std::remove_reference&lt;T&gt;::type&amp;&amp;&gt;(t),其中 Tt 的类型(参见 §20.2.3/6)。在您的情况下,它解析为static_cast&lt;int&amp;&amp;&gt;(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&lt;T&amp;&amp;&gt;(t)Tint,我们得到 static_cast&lt;int&amp;&amp;&gt;(nb),即 - 我们得到两个完全相同的演员表。

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

【讨论】:

【参考方案2】:

没有区别。


【讨论】:

以上是关于std::forward vs std::move 同时将左值绑定到右值引用的主要内容,如果未能解决你的问题,请参考以下文章

std::move()和std::forward()

std::forward 与 std::move 的用法

std :: move和std :: forward之间有什么区别

std::move与std::forward

std::move与std::forward

std::move与std::forward