我真的想了解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?