移动语义std :: move如何使用它

时间:2011-04-03 13:32:25

标签: c++ visual-c++ c++11 rvalue-reference move-semantics

#include <type_traits>

template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
    return v;
}

void main()
{
    int a;
    move(a);
}

为什么这段代码不能编译?

  

错误C2440:'return':无法在'int&amp;&amp;'中转换'int''

2 个答案:

答案 0 :(得分:6)

v是return语句中的左值(出于安全原因,名为rvalue的引用是左值),但move的返回类型是右值引用(T是{{ 1}},但删除了引用,因此在返回类型中形成类型int&

当您想要返回时,首先需要int && static_castv来创建未命名的右值引用。

我不确定你的目标是什么。您要么使用remove_reference<T>::type &&(就像您在标题中所说的那样),要么想了解它的实现方式(就像您显示的代码所示)。在不了解基本C ++规则的情况下尝试了解std::move如何工作是没有意义的。我建议您查看我们的C++ Books List。掌握了C ++之后,您可以了解std::move的工作原理。

答案 1 :(得分:4)

这直接来自C ++ 0x草案标准(§20.2.3/ 6):

  

template <class T> typename remove_reference<T>::type&& move(T&& t) noexcept;

     

返回static_cast<typename remove_reference<T>::type&&>(t)

因此,如果您将move实施更改为以下内容,则可以正常运行:

template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
    return static_cast<typename std::remove_reference<T>::type&&>(v);
}