移动语义 std::move 如何使用它

发布于 2024-10-30 10:48:45 字数 313 浏览 3 评论 0 原文

#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);
}

Why doesn't this code compile?

error C2440: 'return' : impossible to convert 'int' in 'int &&'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花开柳相依 2024-11-06 10:48:46

v 是 return 语句中的左值(出于安全原因,命名的右值引用是左值),但 move 的返回类型是右值引用(T< /code> 是 int&,但是您删除了引用,因此您在返回类型中形成了 int && 类型)。

您需要首先将 vstatic_castremove_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 of move is an rvalue reference (T is int&, but you remove the reference, so you form the type int && in the return type).

You need to static_cast the v to remove_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 how std::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 how std::move works.

ま昔日黯然 2024-11-06 10:48:46

这直接来自 C++0x 草案标准 (§20.2.3/6):

模板 类型名remove_reference::type&& move(T&& t) noexcept;

返回static_cast::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);
}

This is straight out of the C++0x draft standard (§20.2.3/6):

template <class T> typename remove_reference<T>::type&& move(T&& t) noexcept;

Returns: static_cast<typename remove_reference<T>::type&&>(t).

Consequently, if you change your move implementation to the following, it works just fine:

template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
    return static_cast<typename std::remove_reference<T>::type&&>(v);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文