移动其内容后调用vector.resize(0)是否安全

时间:2016-06-07 15:54:33

标签: c++ language-lawyer

换句话说是以下代码声音(定义的行为,便携式,......)

   std::vector<int> vec(100,42);
   std::vector<int> other = std::move(vec);
   vec.resize(0);//is this sound

   //using vec like an empty vector

2 个答案:

答案 0 :(得分:9)

是的,这是安全的。

来自§23.3.6.5:

  

如果sz <= size(),则相当于调用pop_back() size() - sz次。如果size() < sz,请将sz - size()默认插入的元素附加到序列中。

所以基本上,当你致电resize(0)时,它会调用pop_back(),直到从矢量中删除每个元素。

移动vec并不重要,因为即使vec的状态未指定,它仍然是您可以修改的有效矢量。

因此,调用std::vector后,resize(0)将为空。

答案 1 :(得分:5)

从对象移动后,通常不能对对象的状态做出任何假设。这意味着您只能调用没有任何前提条件的成员函数。令人高兴的是,*p++没有依赖于价值的先决条件,因此您可以在移动的向量上调用std::vector::resize