std :: vector是否需要使用move而不是copy?

时间:2017-10-30 14:22:19

标签: c++ c++11 vector

按标准重新分配增长/交换/删除时,std::vector是否需要使用move而不是copy?或者这纯粹是实施优化?

如果std::vector 需要使用移动,在什么条件下?哪些规则/条件可以阅读?

我发现了How to enforce move semantics when a vector grows?。但是没有关于担保的答案。

更新

何时需要在重新分配时使用移动构造函数?它说它需要重新分配移动语义吗?

2 个答案:

答案 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一起使用。它可以是任何东西,因为它允许任何东西。