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?
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&&.
| 归档时间: |
|
| 查看次数: |
1506 次 |
| 最近记录: |