移动语义 std::move 如何使用它
#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 &&”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
v
是 return 语句中的左值(出于安全原因,命名的右值引用是左值),但move
的返回类型是右值引用(T< /code> 是
int&
,但是您删除了引用,因此您在返回类型中形成了int &&
类型)。您需要首先将
v
static_cast
为remove_reference::type &&
来创建一个未命名 右值引用,当您想要返回它时。我不确定你的目标是什么。您想要使用 std::move(就像您在标题中所说的那样),或者您想了解它是如何实现的(就像您显示的代码所示)。在不了解基本 C++ 规则的情况下尝试了解 std::move 的工作原理是没有意义的。我建议您查看我们的C++ 书籍列表。充分掌握 C++ 后,您可以了解
std::move
的工作原理。v
is an lvalue in the return statement (named rvalue references are lvalues, for safety reasons), but the return type ofmove
is an rvalue reference (T
isint&
, but you remove the reference, so you form the typeint &&
in the return type).You need to
static_cast
thev
toremove_reference<T>::type &&
first to create an unnamed rvalue reference, when you want to return it.I'm not sure what your goal is. Either you want to use
std::move
(like you say in your title), or you want to learn how it would be implemented (like the code you show indicates). It doesn't make sense to try to learn howstd::move
works without knowing the basic C++ rules. I recommend you to have a look in our C++ Books List. After you have a good grasp about C++, you can learn howstd::move
works.这直接来自 C++0x 草案标准 (§20.2.3/6):
因此,如果您将
move
实现更改为以下内容,它就可以正常工作:This is straight out of the C++0x draft standard (§20.2.3/6):
Consequently, if you change your
move
implementation to the following, it works just fine: