Безопасно ли вызывать vector.resize(0) после перемещения его содержимого

Другими словами, это следующий звук кода (определенное поведение, перенос,...)

   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

Ответ 1

Да, это безопасно.

Из § 23.3.6.5:

Если sz <= size(), эквивалентно вызову pop_back() size() - sz раз. Если size() < sz, добавляет sz - size() вставленные по умолчанию элементы в последовательность.

Итак, когда вы вызываете resize(0), он вызывает pop_back(), пока каждый элемент не будет удален из вектора.

Не важно, что вы переместили vec, потому что даже если состояние vec не указано, оно все еще является допустимым вектором, который вы можете изменить.

Итак, std::vector будет пуст после вызова resize(0).

Ответ 2

После перемещения из объекта вы можете вообще не делать никаких предположений о состоянии объекта. Это означает, что вы можете вызывать только функции-члены, которые не имеют каких-либо предварительных условий. К счастью, std::vector::resize не имеет зависимых от стоимости предварительных условий, поэтому вы можете вызвать resize на перемещенном векторе.