#cpp #cpp11
Читаю Прата С++ 2015 стр 1072. В одном абзаце он пишет Если вы не определили конструктор переноса или операцию присваивания с переносом, компилятор не будет автоматически предоставлять конструктор копирования или операцию присваивания с копированием , а в другом Например, если определен конструктор переноса, то конструктор по умолчанию, конструктор копирования и операция присваивания с копированием не предоставляются Что с ним не так? Он сам себе противоречит, можете объяснить что и как генерируется?
Ответы
Ответ 1
ИМХО ошибка перевода. Из оригинала с моим переводом: Конструктор по умолчанию: те же правила, что и в C++98. Генерируется только если класс не содержит определенных пользователем конструкторов. Деструктор: практически те же правила, что и в C++98; единственное отличие - в том, что по умолчанию деструкторы объявляются как noexcept. Как и в C++98, виртуальный если деструктор базового класса также виртуальный. Копирующий конструктор: то же поведение, что и в C++98: вызов копирующего конструктора для всех нестатических членов. Генерируется только если в классе нет определенного пользователем копирующего конструктора. Удаляется, если класс определяет операцию перемещения. Генерация этой функции в классе с определенным пользователем копирующим оператором присваивания или деструктором считается устаревшей (deprecated). Копирующее присваивание: то же поведение, что и в C++98: копирующее присваивание всех нестатических членов. Генерируется только если в классе нет определенного пользователем копирующего присваивания. Удаляется, если в классе присутствует определенная пользователем операция перемещения. Генерация в случае, если в классе есть определенный пользователем копирующий конструктор или деструктор, считается устаревшей (deprecated). Перемещающий конструктор и перемещающее присваивание: перемещают нестатические члены (соответственно конструктором или присваиванием - прим. АА). Генерируются только если класс не содержит определенных пользователем операций копирования, перемещения, или деструкторов. Примечание: шаблонные методы не участвуют в этих правилах, то есть не предотвращают генерацию специальных функций, даже если их специализации могут иметь подходящую форму (переформулировал - АА). UPD: только это, кажется, из другой книги - Effective Modern C++.Ответ 2
Думаю нашел что Вы хотели с примером. If a class has no explicitly defined constructors, the compiler will implicitly declare and define a default constructor for it. This implicitly defined default constructor is equivalent to an explicitly defined one with an empty body. For example: class MyClass { int x; // no constructor, so the compiler produces an (implicit) default constructor }; int main() { MyClass m; // no error at runtime: the (implicit) default constructor is called } If constructors are explicitly defined for a class, but they are all non-default, the compiler will not implicitly define a default constructor, leading to a situation where the class does not have a default constructor. This is the reason for a typical error, demonstrated by the following example. class MyClass { public: MyClass (int y); // declaration a non-default constructor private: int x; }; MyClass :: MyClass (int y) { x = y; } int main() { MyClass m(100); // the non-default constructor is called MyClass * p; // for pointer declarations, the compiler does not need to know about constructors p = new MyClass(); // error at compilation: no default constructor return 0; } Since neither the programmer nor the compiler has defined a default constructor, the creation of the objected pointed to by p leads to an error. Вы были правы. Если нет Конструктора по умолчанию. Он не создается и дает ошибку при использовании. А Выражение "Если вы не определили конструктор переноса или операцию присваивания с переносом, компилятор не будет автоматически предоставлять конструктор копирования или операцию присваивания с копированием", говорит что не будут созданы конструкторы копирования и присваивания. Значит создатся конструктор по умолчанию. от http://en.wikipedia.org/wiki/Default_constructor
Комментариев нет:
Отправить комментарий