Страницы

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

суббота, 4 января 2020 г.

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

#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

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

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