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

Является ли вызов 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() с созданным движением объекта?

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам