我非常想了解std::move()函数的内在细节。
std::move()的代码如下所述:Semantics。
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?
发布于 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&&。
发布于 2016-03-24 17:50:56
std::move可以被认为是一个光荣的演员。它所做的就是将它的参数(一个对象或表达式的结果)的类型转换为所谓的xvalue。它通过返回对它的rvalue引用来做到这一点。
它还考虑到了这样一个事实,即推导出的参数类型可能是一个lvalue,其中强制转换T实际上是一个lvalue引用--这就是为什么它必须从T中移除引用才能得到“真实”类型的参数。
就这样。它实际上不会移动任何东西,也不会清理物体或诸如此类的东西。实际的对象修改是通过相应的move构造函数或评估算子来完成的。
发布于 2016-03-24 17:54:01
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,一旦它有了它,它该如何处理它。
你可以用一个演员做同样的事情:
f(my_type&&(m));但是,在不止一个地方使用时,调用std::move更加清晰和一致。
https://stackoverflow.com/questions/36206764
复制相似问题