首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解std::move()的代码

理解std::move()的代码
EN

Stack Overflow用户
提问于 2016-03-24 17:49:00
回答 3查看 2.6K关注 0票数 4

我非常想了解std::move()函数的内在细节。

std::move()的代码如下所述:Semantics

代码语言:javascript
复制
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

为什么这段代码返回一个rvalue引用?该参数是type引用类型。a是否对rvalue引用所指向的对象进行计算,从而将rvalue引用返回给该对象?另外,为什么需要remove_reference<T>部件?

本教程还编写

此move()为其目标提供了其参数的值,但没有义务保留其源的值。因此,对于向量,可以合理地期望move()将其参数保留为零容量向量,以避免复制所有元素。换句话说,移动是一种潜在的破坏性阅读。

但据说

移动功能的作用真的很小。所有移动操作都是接受lvalue或rvalue参数,并将其作为rvalue返回,而不触发副本构造。

这是否应该被理解为,std::move()首先可以“空”对象(在本例中是std::向量),然后将对象作为rvalue返回(根据C++规范)?但是,官方的std::move()是否与后一引号中所指定的完全相同呢?

为什么说std::move()返回rvalue引用时返回rvalue?

EN

回答 3

Stack Overflow用户

发布于 2016-03-24 18:02:50

std::move()的代码如下所述:Semantics

这是2006中的拟议代码。在移动语义成为C++的一部分之前。这不是std::move在C++中实现的方式,因为语言在2006年到2011年期间显著改变了。如果您想要理解std::move,而不是理解一些描述类似但不同的旧建议,请看一看现代实现。

为什么这段代码返回一个rvalue引用?

因为这就是std::move的全部目的。拿出一个论点,并把它转换成一个价值。

问它为什么这样做就像问为什么make_pair返回一个pair一样。

该参数是type引用类型。

实际上,它是一个“转发引用”,这意味着它可能是一个lvalue引用或rvalue引用。

a是否对rvalue引用所指向的对象进行计算,从而将rvalue引用返回给该对象?

是的,这就是推荐信的工作原理。

另外,为什么需要remove_reference<T>部件?

因为如果使用lvalue调用std::move,那么T将被推断为lvalue引用类型,例如int&。要确保返回类型为int&&,您首先需要删除lvalue引用以获取int,然后添加&&以获得rvalue引用int&&

票数 10
EN

Stack Overflow用户

发布于 2016-03-24 17:50:56

std::move可以被认为是一个光荣的演员。它所做的就是将它的参数(一个对象或表达式的结果)的类型转换为所谓的xvalue。它通过返回对它的rvalue引用来做到这一点。

它还考虑到了这样一个事实,即推导出的参数类型可能是一个lvalue,其中强制转换T实际上是一个lvalue引用--这就是为什么它必须从T中移除引用才能得到“真实”类型的参数。

就这样。它实际上不会移动任何东西,也不会清理物体或诸如此类的东西。实际的对象修改是通过相应的move构造函数或评估算子来完成的。

票数 1
EN

Stack Overflow用户

发布于 2016-03-24 17:54:01

代码语言:javascript
复制
void f(const my_type&);
void f(my_type&&);
my_type m;
f(m);           // calls f(const my_type&)
f(std::move(m); // calls f(my_type&&)

std::move的调用所做的唯一事情就是确保f的参数类型是一个rvalue引用。这取决于f,一旦它有了它,它该如何处理它。

你可以用一个演员做同样的事情:

代码语言:javascript
复制
f(my_type&&(m));

但是,在不止一个地方使用时,调用std::move更加清晰和一致。

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

https://stackoverflow.com/questions/36206764

复制
相关文章

相似问题

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