я могу вызвать деструктор в операторе присваивания?

Является ли вызов d-tor внутри оператора присваивания перемещений хорошей практикой?

вот пример кода:

VectorList &operator = (VectorList &&other){
~VectorList(); // if this is not a good practice,
// I will need to paste whole d-tor here.

_buffer     = std::move(other._buffer       );
_dataCount  = std::move(other._dataCount    );
_dataSize   = std::move(other._dataSize     );

other._clear();

return *this;
}

Должен ли я использовать этот код, или я должен использовать swap () с созданием объекта Move?

3

Решение

~VectorList делает больше, чем просто выполняет код в теле dtor: фактически уничтожает объект.

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

Даже если оно определено, это опасно, так как исключение, возникающее при уничтожении объекта автоматического хранения, является плохой новостью. Кроме того, если назначенный класс действительно является производным типом, сам вызов dtor будет UB!

Ни один из подходящих подходов. Преимущества слишком малы.

Лучшей альтернативой является копирование-своп (который, по крайней мере, легко исправить: он может предотвратить некоторые оптимизации) или рефакторинг «чистого» кода как из dtor, так и из присваивания. Затем позвоните в обоих местах.

5

Другие решения

Скотт Мейерс говорит, что не использовать swap(): http://scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html

Что касается вашей текущей реализации, кажется, вы можете сделать это проще. Я полагаю, что деструктор на самом деле удаляет _buffer и мало что делает. Если это правда, вы должны просто заменить сложный явный вызов деструктора на delete _buffer,

2

По вопросам рекламы [email protected]