首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动语义std::移动如何使用它

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

Stack Overflow用户
提问于 2011-04-03 13:32:25
回答 2查看 2.4K关注 0票数 3
代码语言:javascript
复制
#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’

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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实现更改为以下内容,它将运行得很好:

代码语言:javascript
复制
template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
    return static_cast<typename std::remove_reference<T>::type&&>(v);
}
票数 4
EN

Stack Overflow用户

发布于 2011-04-03 13:49:36

v是返回语句中的lvalue (出于安全考虑,命名rvalue引用是lvalue),但是move的返回类型是rvalue引用(Tint&,但您删除了引用,因此在返回类型中形成了int &&类型)。

当您想要返回vremove_reference<T>::type &&时,您需要首先创建一个未命名的rvalue引用。

我不知道你的目标是什么。要么您想使用std::move (就像您在标题中说的那样),要么您想学习如何实现它(如您显示的代码所指示的)。在不了解基本的std::move规则的情况下,尝试学习C++的工作方式是没有意义的。我建议你看看我们的C++ Books List。在您很好地掌握了C++之后,您可以了解std::move是如何工作的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5529881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档