Когда компилятор предоставляет определения для специальных членов класса? - PullRequest
4 голосов
/ 24 декабря 2011

Я знаю, что когда я определяю пустой класс и вообще не предоставляю объявлений, компилятор предоставит определения для конструктора по умолчанию и копирования, деструктора и оператора копирования.

Каковы правиладля этого? Когда компилятор не предоставляет, скажем, конструктор копирования?А как насчет конструктора перемещения и оператора присваивания перемещения?

(Пример: компилятор не будет предоставлять определения для любого оператора присваивания, если у моего класса есть ссылочный член, такой как int&. Когда еще произойдет что-то подобное?)

1 Ответ

2 голосов
/ 25 декабря 2011

Редактировать: В C ++ 11 это сложнее, чем объявлено неявно или нет. Они могут быть либо неявно объявлены и по умолчанию, неявно объявлены и удалены, либо необъявленные. Прочитайте это , чтобы различить последние 2. Следующая информация не совсем верна, поскольку она не различает объявленные и удаленные и необъявленные.

Ниже идет работа. (?) означает, что я хотел бы уточнить или дать количественную оценку утверждению.

Специальные функции-члены §12 / 1

Реализация будет неявно объявлять эти функции-члены для некоторых типов классов, когда пользователь явно не объявляет их:

  • конструктор по умолчанию
  • конструктор копирования
  • оператор присваивания копии
  • Переместить конструктор
  • оператор назначения перемещения
  • деструктор

Специальная функция-член НЕ будет неявно объявлена, если тип имеет ...


Конструктор по умолчанию §12.1 / 5


Конструктор копирования §12.8 / 8, §12.8 / 12

  • объявленный пользователем конструктор перемещения
  • объявленный пользователем оператор назначения перемещения
  • элемент нестатических данных ссылочного типа rvalue
  • вариант-член с нетривиальным конструктором копирования и являющийся объединяющим классом (?)
  • нестатический элемент данных типа (или его массива), который не может быть скопирован
  • прямой или виртуальный базовый класс без конструктора доступных копий

* Такое неявное объявление не рекомендуется, если в классе есть пользовательский оператор копирования или пользовательский деструктор (?)


Оператор назначения копирования §12.8 / 19, §12.8 / 24

  • объявленный пользователем конструктор перемещения
  • объявленный пользователем оператор назначения перемещения
  • вариантный член с нетривиальным оператором присваивания копии, являющийся объединяющим классом (?)
  • элемент нестатических данных const, не относящийся к классу (или его массив)
  • нестатический элемент данных ссылочного типа
  • элемент нестатических данных с оператором недоступного копирования
  • прямой или виртуальный базовый класс с оператором назначения недоступных копий

* Такое неявное объявление не рекомендуется, если в классе есть пользовательский конструктор копирования или пользовательский деструктор (?)


Конструктор Move §12.8 / 10, §12.8 / 12

  • конструктор копирования, объявленный пользователем
  • заявленный пользователем оператор присвоения копии
  • объявленный пользователем оператор присваивания перемещения
  • деструктор, объявленный пользователем
  • Конструктор перемещения не будет неявно определен как удаленный (?)
  • вариант-член с нетривиальным конструктором перемещения и является объединенным классом (?)
  • нестатический элемент данных типа (или его массива), который не может быть перемещен
  • нестатический член данных или прямой или виртуальный базовый класс с типом, который не имеет конструктора перемещения и не может быть легко скопирован
  • прямой или виртуальный базовый класс без доступного конструктора перемещения

Оператор назначения перемещения §12.8 / 21, §12.8 / 24

  • конструктор копирования, объявленный пользователем
  • объявленный пользователем конструктор перемещения
  • объявленный пользователем оператор присвоения копии
  • деструктор, объявленный пользователем
  • оператор присваивания перемещения не будет неявно определен как удаленный (?)
  • вариантный член с нетривиальным оператором присваивания перемещения и является объединяющим классом (?)
  • элемент нестатических данных типа const, не относящегося к классу (или его массив)
  • нестатический элемент данных ссылочного типа
  • нестатический элемент данных с недоступным оператором назначения перемещения и не может быть просто скопирован
  • прямой или виртуальный базовый класс с недоступным оператором присваивания перемещений, который не может быть просто скопирован

Destructor §12.4 / 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...