在从std :: vector移动时调用.clear(),. shrink_to_fit(),. empty()是否合法?

时间:2018-04-08 22:59:25

标签: c++ c++14

作为这两个问题的具体子句:

Is a moved-from vector always empty?

What can I do with a moved-from object?

有人想知道:在为其分配新的向量之前调用.clear().chrink_to_fit().empty()移动std::vector是否合法?我可以询问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); // 

修改

我应该澄清,有些操作确实有前提条件:因此,(正如你可以在其他问题中读到的那样),移动后所有操作都不合法。

我的问题可以这样重写:这三个操作中是否有任何先决条件?问题的一个来源可能是与从对象移动的分配器相关的精细打印。

3 个答案:

答案 0 :(得分:6)

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

因此,您可以致电clearshrink_to_fitemptypush_back等。

但是你应该从clear开始,因为那个未指定的限定符:)。

答案 1 :(得分:0)

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

  

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

至于move d std::vector的合法性,可能取决于其他功能对它的作用。我的预感是,对于大多数实现,你可以做任何你想做的事情,但我不相信任何地方都能保证。可能所有成员函数都会失败(有效可能意味着它们不会崩溃,但对象实际上仍然无用)。

答案 2 :(得分:0)

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

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