Что такое нетривиальный конструктор в C ++? - PullRequest
63 голосов
/ 10 октября 2010

Я читал это http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data

Упоминается тривиальный конструктор по умолчанию, тривиальный конструктор копирования, оператор назначения копирования, тривиальный деструктор. Что тривиально, а не тривиально?

Ответы [ 3 ]

73 голосов
/ 10 октября 2010

Проще говоря, «тривиальная» специальная функция-член буквально означает функцию-член, которая выполняет свою работу очень простым способом.«Прямая манера» означает разные вещи для разных видов специальных функций-членов.

Для конструктора и деструктора по умолчанию «тривиально» означает буквально «вообще ничего не делать».Для конструктора копирования и оператора копирования-назначения «тривиальное» означает буквально «быть эквивалентным простому копированию в необработанной памяти» (например, копирование с memcpy).

Если вы определяете конструктор самостоятельно, это считаетсянетривиальный, даже если он ничего не делает, поэтому тривиальный конструктор должен быть неявно определен компилятором.

Чтобы специальная функция-член удовлетворяла вышеуказанным требованиям, класс должен иметь очень упрощенную структуру, он не должен требовать каких-либо скрытых инициализаций при создании или разрушении объекта или каких-либо скрытых дополнительных внутренних манипуляций.когда он копируется.

Например, если класс имеет виртуальные функции, он потребует некоторых дополнительных скрытых инициализаций при создании объектов этого класса (инициализация таблицы виртуальных методов и т. д.), поэтому конструктор для этогокласс не будет квалифицирован как тривиальный.

В другом примере, если у класса есть виртуальные базовые классы, то каждый объект этого класса может содержать скрытые указатели, которые указывают на другие части того же самого объекта.Такой объект со ссылками на саму себя не может быть скопирован простой подпрограммой копирования памяти (например, memcpy).Дополнительные манипуляции будут необходимы для правильной повторной инициализации скрытых указателей в копии.По этой причине конструктор копирования и оператор копирования-копирования для этого класса не будут квалифицироваться как тривиальные.

По очевидным причинам это требование является рекурсивным: все подобъекты класса (базовые и нестатические члены) также должныесть тривиальные конструкторы.

29 голосов
/ 10 октября 2010

Конструктор класса A является тривиальным , если все следующее верно:

  • Неявно определяется (синтезируется компилятором)
  • A не имеет виртуальных функций и виртуальных базовых классов
  • Все прямые базовые классы A имеют тривиальные конструкторы
  • Классы всех нестатических членов-данных A имеют тривиальные конструкторы
21 голосов
/ 26 апреля 2013

Уже есть правильные ответы, но вот цитата из Стандарта (которую я искал, когда наткнулся на этот пост):

(§12.1 / 5) Конструктор по умолчанию -тривиальный, если он не предоставлен пользователем и если:
- его класс не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1), и
- ни один элемент нестатических данных в своем классе не имеет скобки-или-равный-инициализатор и
- все прямые базовые классы этого класса имеют тривиальные конструкторы по умолчанию, а
- для всех нестатических членов-данных этого класса, которые имеют тип класса (или его массив)), каждый такой класс имеет тривиальный конструктор по умолчанию.

Это из C ++ 11.В C ++ 03 отсутствует второй элемент и используется фраза , неявно объявленная вместо , не предоставленная пользователем .В остальном он идентичен.

Обратите внимание, что эта спецификация охватывает только тривиальные конструкторы по умолчанию.Атрибут слова trivial также может использоваться в различных контекстах, например, в конструкторах копирования.

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