按标准重新分配增长/交换/删除时,std::vector
是否需要使用move而不是copy?或者这纯粹是实施优化?
如果std::vector
需要使用移动,在什么条件下?哪些规则/条件可以阅读?
我发现了How to enforce move semantics when a vector grows?。但是没有关于担保的答案。
更新
何时需要在重新分配时使用移动构造函数?它说它需要重新分配移动语义吗?
答案 0 :(得分:5)
std::vector
是否需要按标准使用移动而不是复制?
我认为你指的是元素的移动和复制。
如果您不使用执行这些操作的成员函数,则根本不需要使用复制或移动。复制元素需要一些成员函数,移动元素需要其他成员函数。
当需要在重新分配时使用移动构造函数
如果元素不能复制,则需要使用move(这不需要规则,你不能做你不能做的事情)。否则,如果移动构造函数可以抛出则需要复制(这是下面引用的强异常保证所要求的)。如果可以证明非投掷移动,那么它似乎取决于实施,因为我没有找到任何进一步的保证。一个好的实现将在noexcept
时移动。
相关职能的例外保证:
如果除非由非CopyInsertable T的移动构造函数抛出异常,则不会产生任何影响。
答案 1 :(得分:0)
用户2079303的答案很好,但我总结一下,仅供我自己使用。
标准C ++ 17 要求std::vector
在重新分配期间移动。
如果对象是可复制的,它允许始终使用副本。
例如,每当需要在成长时重新分配其元素时,std::vector<std::vector<std::array<char, 10000>>>
都可以复制。
不要相信图书馆实施者,请始终检查您的可复制+可移动类型如何在您的环境中与std::vector
一起使用。它可以是任何东西,因为它允许任何东西。