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

Joh*_*erg 0 c++ c++14

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

移动的向量是否总是空的?

移动物体怎么办?

人们不禁要问:是合法的调用.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); // 
Run Code Online (Sandbox Code Playgroud)

编辑:

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

因此,我的问题可以这样重述:三种操作中的任何一种都有任何先决条件吗?问题的一个原因可能是与从对象移动的分配器相关的精细打印.

dru*_*nly 6

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

所以,你可以打电话clear,shrink_to_fit,empty,push_back,等.

但是你可能应该从clear那个未指明的限定符开始:).

  • 要添加到此,"有效但未指定"状态意味着您可以在没有前提条件但没有其他条件的对象上调用函数. (4认同)