#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
是右值引用(T
is int&
,但您删除了引用,因此您int &&
在返回类型中形成类型)。
当您想要返回它时,您static_cast
需要首先创建一个未命名的右值引用。v
remove_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);
}