作为这两个问题的具体子句:
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); //
修改
我应该澄清,有些操作确实有前提条件:因此,(正如你可以在其他问题中读到的那样),移动后所有操作都不合法。
我的问题可以这样重写:这三个操作中是否有任何先决条件?问题的一个来源可能是与从对象移动的分配器相关的精细打印。
答案 0 :(得分:6)
是。移动对象会使其处于未指定的但有效的状态。
因此,您可以致电clear
,shrink_to_fit
,empty
,push_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())。
或者它可能是我想不到的任何其他东西,但它们看起来都应该是容器的有效状态。