在从 std::vector 移动的上调用 .clear()、.shrink_to_fit()、.empty() 是否合

is it legal to call .clear(), .shrink_to_fit(), .empty() on a moved from std::vector?

本文关键字:shrink to fit 是否 empty std 移动 vector clear 调用 在从      更新时间:2023-10-16

作为这两个问题的特定子案例:

移自向量总是空的吗?

我能对移出对象执行哪些操作?

人们想知道:在为移动的std::vector上调用.clear().chrink_to_fit().empty()是否合法?我可以问push_back()但我不知道这会给出什么,因为依赖从向量移动为空是不安全的。

显而易见的是,销毁以及来自新载体的分配是合法的。

std::vector<int> fs = getVec();
giveVecs(std::move(fs));
fs.empty();  // 1.?
fs.size();   // 2.?
fs.shrink_to_fit(); // 3.?
fs.clear(); // //4. ?
fs = {} ; // 5. Should be fine, but weird when we have .clear()
fs.push_back(1); // 

编辑:

我应该澄清一下,有些操作确实有先决条件:因此,(正如您可以在其他问题中读到的那样(,并非所有操作移动后都是合法的。

因此,我的问题可以这样重申:三项行动中的任何一项是否有任何先决条件?问题的一个来源可能是与移动对象的分配器相关的细则。

是的。移动对象会使其处于未指定但有效的状态。

所以你可以调用clearshrink_to_fitemptypush_back等。

但是您可能应该从clear开始,因为未指定的限定符:)。

合法但未指定的状态可能真的是空的(使用内部缓冲区移动(;它可能是移动到容器的内容(使用交换(,可能是它仍然有移动到容器的内存;但所有元素都被破坏了,size((报告零(swap&clear(((。

或者可能是我没有想到的任何其他事情,但它们都应该看起来像容器的有效状态。

移动的对象处于有效但未指定的状态。 通过谷歌的魔力,该标准的相关部分是 17.6.5.15 [lib.types.movedfrom]

C++标准库中定义的类型的对象可以从 (12.8( 中移动。移动操作可以显式指定或隐式生成。除非另有说明,否则此类移出对象应处于有效但未指定的状态。

至于什么是合法的move std::vector,这可能取决于其他函数对它做了什么。 我的预感是,对于大多数实现,您几乎可以做任何您想做的事情,但我不相信这在任何地方都能保证。 所有成员函数都可能失败(有效可能意味着它们不会崩溃,但对象实际上保持无用(。