#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''
答案 0 :(得分:6)
v
是return语句中的左值(出于安全原因,名为rvalue的引用是左值),但move
的返回类型是右值引用(T
是{{ 1}},但删除了引用,因此在返回类型中形成类型int&
。
当您想要返回时,首先需要int &&
static_cast
到v
来创建未命名的右值引用。
我不确定你的目标是什么。您要么使用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);
}