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<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
不适合以这种方式使用。
【讨论】:
【参考方案2】:没有区别。
【讨论】:
以上是关于std::forward vs std::move 同时将左值绑定到右值引用的主要内容,如果未能解决你的问题,请参考以下文章