理解std :: move()的代码

And*_*sen 3 c++ stl vector c++11

我真的想了解std :: move()函数的内在细节.

std :: move()的代码如下所示:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics.

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}
Run Code Online (Sandbox Code Playgroud)

为什么此代码返回右值引用?该参数是类型T右值参考.是否a计算rvalue引用指向的对象,以便将rvalue引用返回给对象?另外,为什么remove_reference<T>需要这部分?

该教程还写道

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

但话说回来

移动功能确实做得很少.所有move都接受lvalue或rvalue参数,并将其作为右值返回,而不触发复制构造.

如果这被理解为,std :: move()可以先"清空"对象(在本例中为std :: vector),然后将对象作为右值返回(根据C++规范)?但是,官方的std :: move()完全按照后面引用的规定进行了吗?

为什么当它返回一个右值引用时,它说std :: move()返回一个rvalue?

Jon*_*ely 8

std :: move()的代码如下所示:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics.

那是2006年提出的代码.在移动语义之前是C++的一部分.这不是如何std::move在C++中实现的,因为语言在2006年和2011年之间发生了显着变化.如果您想了解std::move,请查看现代实现,而不是了解描述类似但不同的旧提议.

为什么此代码返回右值引用?

因为这是完整的目的std::move.拿一个参数并将其转换为右值.

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

该参数是类型T右值参考.

实际上它是一个"转发参考",这意味着它可能是左值引用或右值引用.

是否a计算rvalue引用指向的对象,以便将rvalue引用返回给对象?

是的,这就是参考的工作原理.

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

因为如果std::move用左值调用if ,那么将推T导出左值引用类型,例如int&.要确保返回类型int&&,首先需要删除要获取的左值引用int,然后添加&&以获取右值引用,int&&.