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

use*_*183 11 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
Run Code Online (Sandbox Code Playgroud)

Rak*_*111 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).

  • [仅供参考]根据`pop_back`定义`resize`是[缺陷](http://wg21.cmeerw.net/lwg/issue2160). (4认同)
  • 不,你不能调用`pop_back()`,因为`pop_back()`有前提条件.但是,`size()`没有,并且一旦你调用`size()`并确保它大于0,你就检查了向量是否满足`pop_back()`的前提条件,所以它然后可以安全地调用它. (3认同)

Ker*_* SB 5

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

  • @Walter:不言而喻.每个对象都有效.否则它不是一个对象. (4认同)
  • @Walter:当然,我明白你的意思,而且我知道引用得很多的"有效但没有说明".但是我想指出移动构造和赋值只是普通的成员函数,并且它们与现有的约定和设计有任何不同之处,并且没有任何东西需要明确地调用.要点是"未指明的状态"意味着"可能不满足任何先决条件". (2认同)