Что такое нетривиальный конструктор в C++?


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

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

3   60   2010-10-10 10:06:31

3 ответа:

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

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

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

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

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

конструктор класса A-это тривиальные Если верно все следующее:

  • он неявно определен (синтезирован компилятором)
  • a не имеет виртуальных функций и виртуальных базовых классов
  • Все прямые базовые классы A имеют тривиальные конструкторы
  • классы всех нестатических членов данных A имеют тривиальные конструкторы

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

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

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

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