Другими словами, это следующий звук кода (определенное поведение, перенос,...)
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
Другими словами, это следующий звук кода (определенное поведение, перенос,...)
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
Да, это безопасно.
Из § 23.3.6.5:
Если
sz <= size()
, эквивалентно вызовуpop_back()
size() - sz
раз. Еслиsize() < sz
, добавляетsz - size()
вставленные по умолчанию элементы в последовательность.
Итак, когда вы вызываете resize(0)
, он вызывает pop_back()
, пока каждый элемент не будет удален из вектора.
Не важно, что вы переместили vec
, потому что даже если состояние vec
не указано, оно все еще является допустимым вектором, который вы можете изменить.
Итак, std::vector
будет пуст после вызова resize(0)
.
После перемещения из объекта вы можете вообще не делать никаких предположений о состоянии объекта. Это означает, что вы можете вызывать только функции-члены, которые не имеют каких-либо предварительных условий. К счастью, std::vector::resize
не имеет зависимых от стоимости предварительных условий, поэтому вы можете вызвать resize
на перемещенном векторе.