Страницы

Поиск по вопросам

вторник, 11 июня 2019 г.

Пользовательский конструктор копирования/перемещения

Правильно ли я понимаю, что будет плохой техникой реализовывать конструкторы копирования/перемещения, используя соответствующие операторы присваивания?
Т.е. лучше ли использовать списки инициализации, соответственно, в случае перемещения в них надо указывать дополнительно при надобности приведение к rvalue с помощью std::move(), а в теле перемещающего конструктора «обнулить» rhs (это по соглашению проекта)? Ну и какие-то дополнительные операции в теле, например, копирование поэлементное массива или логирование.


Ответ

Вообще говоря, да, это будет странной техникой.
С общей точки зрения попытки реализовать конструктор копирования через копирующий оператор присваивания будут страдать от проблемы "двойной инициализации": так как оператор присваивания ожидает на вход уже сконструированные объекты, в конструкторе придется сначала конструировать какой-то (пустой) объект, а лишь затем вызывать для него оператор присваивания, который будет "переконструировать" этот объект по-новому.
В устоявшихся идиомах обычно делают наоборот: копирующий оператор присваивания реализуется через конструктор копирования. Так это делается, например, в известной идиоме Copy-And-Swap.

Комментариев нет:

Отправить комментарий