Производится ли генерация неявно определенных функций-членов независимо для каждого класса в иерархии классов в C ++? - PullRequest
0 голосов
/ 31 марта 2020

Влияет ли определенная пользователем функция " Правило 5 " (деструктор, конструктор копирования, оператор копирования-назначения, конструктор перемещения или оператор назначения перемещения) в конкретном классе, влияют ли эти функции будет генерироваться в своих производных или базовых классах? Если да, то каким образом?

Другими словами, если я пытаюсь определить, какие функции будут неявно сгенерированы для определенного класса, нужна ли мне информация о его родительских или дочерних классах?

Необязательный вопрос : Влияет ли присутствие одной из этих функций в определенном классе на сгенерированный код для неявно сгенерированных функций других классов в иерархии? Если да, то каким образом?

1 Ответ

3 голосов
/ 31 марта 2020

Компилятор всегда объявляет деструктор для класса C, у которого нет объявленного пользователем деструктора (C ++ 17 [class.dtor] / 4). Однако если какой-либо базовый класс C имеет удаленный или недоступный конструктор, то деструктор C также будет объявлен как удаленный (p5).

Аналогичное утверждение верно для конструкторов копирования ([class .copy.ctor] / 6) и скопировать операторы присваивания ([class.copy.assign] / 2).

В случае конструктора перемещения компилятор неявно объявляет его только для класса C если пользователь не объявил any Правило 5 функций для C ([class.copy.ctor] / 8). Базовые классы C могут влиять на то, удален ли конструктор перемещения C или нет, но они не влияют на то, генерирует ли компилятор объявление. Аналогичное утверждение верно для операторов присваивания перемещения ([class.copy.assign] / 4).

...