C 11 标准库中的自移动分配
C 11 标准包含有关自移动分配的各种规定,特别是与标准结合使用图书馆。本文阐明了这些规定,重点关注库函数中自移动赋值的含义。
具体来说,该标准保证当标准库函数中的参数是右值引用参数时,实现可以假定其独占性。这意味着实现可以基于传递的对象不会被函数修改的理解来优化代码。
在自移动分配的上下文中,这种保证具有显着的影响。例如,考虑以下函数:
template<class T> std::vector<T> selfAssign(std::vector<T> v) { v = std::move(v); return v; }
当传递左值时,将调用向量的复制构造函数,创建输入向量的副本。然而,由于标准库的保证,向量的移动赋值运算符的实现可以假设其参数是纯右值。因此,自移动分配是不可行的,并且函数的行为取决于实现。
在大多数情况下,自移动分配使原始向量处于无资源状态(0 容量) 。如果向量已经拥有 0 容量,则该操作变为空操作。然而,值得注意的是,在自移动分配后,原始向量和移动向量的状态都未指定。
工作草案 N4618 中标准的最新更新进一步澄清了这些规定,在 MoveAssignable 中指定要求,其中将右值 (rv) 分配给表达式 (t),如果 t 和 rv 不引用同一对象,则 t 只需在赋值之前获取 rv 的值即可。不管这种情况如何,赋值后 rv 的状态仍然未指定。
此外,注释强调 rv 必须遵守使用它的库组件的要求,无论 t 和 rv 是否引用同一对象。
以上是C 11 标准库函数中的自移动赋值有任何保证吗?的详细内容。更多信息请关注PHP中文网其他相关文章!