[英]How to force std::vector to use move constructor instead of the copy one?
[英]are std::vector required to use move instead of copy?
std::vector
是否需要使用move而不是copy,在标准的grow / swap / erase重新分配时? 或者这是纯粹的实施优化?
如果std::vector
需要使用move,在什么条件下? 哪些规则/条件可以阅读?
我发现这个如何在向量增长时强制执行移动语义? 。 但是没有关于担保的答案。
UPDATE
什么时候需要在重新分配时使用移动构造函数? 它说它需要重新分配移动语义?
std::vector
是否需要使用move而不是copy,按标准?
我认为你指的是元素的移动和复制。
如果您不使用执行这些操作的成员函数,则根本不需要使用复制或移动。 复制元素需要一些成员函数,移动元素需要其他成员函数。
当需要在重新分配时使用移动构造函数
如果元素不是可复制插入的,则需要使用move(这不需要规则,你不能做你不能做的事情)。 否则,如果移动构造函数可以抛出则需要复制(这是下面引用的强异常保证所要求的)。 如果可以证明非投掷移动,那么它似乎取决于实施,因为我没有找到任何进一步的保证。 一个好的实现将在noexcept
时移动。
相关功能的例外保证:
如果除非由非CopyInsertable T的移动构造函数抛出异常,则不会产生任何影响。
user2079303的答案很好,但我总结一下,仅供我自己使用。
标准C ++ 17 根本不需要std::vector
在重新分配期间移动。 如果对象是可复制的,它允许始终使用副本。
例如, std::vector<std::vector<std::array<char, 10000>>>
每次都需要复制,当需要在grow上重新分配其元素时。
不要相信库实现者,总是检查你的可复制+可移动类型如何在你的环境中使用std::vector
。 它可以是任何东西,因为它允许任何东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.