#include <type_traits>
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
return v;
}
void main()
{
int a;
move(a);
}为什么这段代码不编译?
error C2440:“返回”:不可能在'int &‘
中转换'int’
发布于 2011-04-03 13:51:49
这直接超出了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);
}发布于 2011-04-03 13:49:36
v是返回语句中的lvalue (出于安全考虑,命名rvalue引用是lvalue),但是move的返回类型是rvalue引用(T是int&,但您删除了引用,因此在返回类型中形成了int &&类型)。
当您想要返回v到remove_reference<T>::type &&时,您需要首先创建一个未命名的rvalue引用。
我不知道你的目标是什么。要么您想使用std::move (就像您在标题中说的那样),要么您想学习如何实现它(如您显示的代码所指示的)。在不了解基本的std::move规则的情况下,尝试学习C++的工作方式是没有意义的。我建议你看看我们的C++ Books List。在您很好地掌握了C++之后,您可以了解std::move是如何工作的。
https://stackoverflow.com/questions/5529881
复制相似问题