#include <type_traits>
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
return v;
}
void main()
{
int a;
move(a);
}
为什么这段代码不能编译?
错误 C2440:“返回”:无法在“int &&”中转换“int”
#include <type_traits>
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
return v;
}
void main()
{
int a;
move(a);
}
为什么这段代码不能编译?
错误 C2440:“返回”:无法在“int &&”中转换“int”
v是返回语句中的左值(命名右值引用是左值,出于安全原因),但返回类型move是右值引用(Tis int&,但您删除了引用,因此您int &&在返回类型中形成类型)。
当您想要返回它时,您static_cast需要首先创建一个未命名的右值引用。vremove_reference<T>::type &&
我不确定你的目标是什么。要么你想使用std::move(就像你在标题中说的那样),要么你想了解它是如何实现的(就像你展示的代码所示)。std::move在不了解基本 C++ 规则的情况下尝试了解其工作原理是没有意义的。我建议您查看我们的C++ Books List。在掌握了 C++ 之后,您可以了解其std::move工作原理。
这直接来自 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);
}