Страницы

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

понедельник, 4 февраля 2019 г.

Автогенерируемые конструкторы и операторы присваивания rvalue

Читаю Прата С++ 2015 стр 1072.
В одном абзаце он пишет
Если вы не определили конструктор переноса или операцию присваивания с переносом, компилятор не будет автоматически предоставлять конструктор копирования или операцию присваивания с копированием
, а в другом
Например, если определен конструктор переноса, то конструктор по умолчанию, конструктор копирования и операция присваивания с копированием не предоставляются
Что с ним не так? Он сам себе противоречит, можете объяснить что и как генерируется?


Ответ

ИМХО ошибка перевода. Из оригинала с моим переводом:
Конструктор по умолчанию: те же правила, что и в C++98. Генерируется только если класс не содержит определенных пользователем конструкторов.
Деструктор: практически те же правила, что и в C++98; единственное отличие - в том, что по умолчанию деструкторы объявляются как noexcept. Как и в C++98, виртуальный если деструктор базового класса также виртуальный.
Копирующий конструктор: то же поведение, что и в C++98: вызов копирующего конструктора для всех нестатических членов. Генерируется только если в классе нет определенного пользователем копирующего конструктора. Удаляется, если класс определяет операцию перемещения. Генерация этой функции в классе с определенным пользователем копирующим оператором присваивания или деструктором считается устаревшей (deprecated).
Копирующее присваивание: то же поведение, что и в C++98: копирующее присваивание всех нестатических членов. Генерируется только если в классе нет определенного пользователем копирующего присваивания. Удаляется, если в классе присутствует определенная пользователем операция перемещения. Генерация в случае, если в классе есть определенный пользователем копирующий конструктор или деструктор, считается устаревшей (deprecated).
Перемещающий конструктор и перемещающее присваивание: перемещают нестатические члены (соответственно конструктором или присваиванием - прим. АА). Генерируются только если класс не содержит определенных пользователем операций копирования, перемещения, или деструкторов.
Примечание: шаблонные методы не участвуют в этих правилах, то есть не предотвращают генерацию специальных функций, даже если их специализации могут иметь подходящую форму (переформулировал - АА).
UPD: только это, кажется, из другой книги - Effective Modern C++

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

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