Re: move assignment wtf
От: watchmaker  
Дата: 19.11.15 11:26
Оценка: 107 (2) +1
Здравствуйте, Кодт, Вы писали:

К>Вопрос: в какой момент должны быть вызваны деструкторы элементов контейнера?

К>- в момент переноса тела вектора
К>- в деструкторе b
Вопрос про элементы X(1), X(2), X(3)? Для них допустимы обе реализации поведения.

К>Т.е. реализовано через два swap'а или через один?

Либо через ноль swap'ов, либо через один. Куда два то?


К> // казалось бы!

К> a_ = std::move(src.a_);
К> }
Обычно советуют делать move с освобождением ресурсов, а не через swap. Но даже для стандартного std::vector это не всегда возможно.

К>Почему это может быть важно: если элементы — тяжёлые, с каким-то очень содержательным поведением в деструкторе. Ну там окошки позахлопывать.

Именно, если элементы занимают много ресурсов, то выгоднее сразу их освободить. Иначе же при реализации перемещения через swap они будут жить до смерти контейнера b, что иногда происходит чуть ли не в самом конце программы.
Но иногда либо это не важно, либо сложно придумать или неудобно ввести некоторое корректное, но пустое состояние объекта, который ничем не владеет, и тогда перемещение через swap может оказаться проще.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.