Использование тривиального конструктора - PullRequest
1 голос
/ 05 января 2012

12.1 / 5 Конструктор тривиален, если он является неявно объявленным конструктором по умолчанию и если:

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

Сначала я подумал, что тривиальный конструктор - это просто неявный конструктор по умолчанию.Но при чтении приведенного выше текста в стандарте кажется, что тривиальный конструктор не только неявный конструктор по умолчанию, но и другие требования, как упомянуто выше.Что это значит?Какой смысл иметь тривиальный конструктор?

Например:

class X
{
  // ...
};

Есть ли в классе X тривиальный или неявный конструктор по умолчанию?

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Это зависит от того, что находится в // ....

Каждый тривиальный конструктор является неявно объявленным конструктором по умолчанию, но не каждый неявно объявленный конструктор по умолчанию является тривиальным конструктором.Класс X имеет тривиальный деструктор, если он имеет неявное значение по умолчанию, и каждый из его базовых классов имеет неявное значение по умолчанию (а также базовые классы этих базовых классов,и т. д.), и каждый из его членов является либо примитивом, подобным int, либо имеет тип с неявным значением по умолчанию (как и члены его членов, и так далее, а такжекак базовые классы его членов, их базовые классы и т. д., так же как и члены его базовых классов, и их члены, и т. д., и т. д., и т. д.).

Может быть проще взглянуть на это с другой стороны: если класс не не имеет тривиального конструктора, то ни один класс не расширяет его ("is-a") или не включает его ("has-a")") имеет тривиальный конструктор.

1 голос
/ 05 января 2012

Тривиальный конструктор вообще ничего не делает.Список из вашего поста говорит, что конструктор тривиален, когда:

  1. Вы не заставили ваш конструктор работать, предоставив конструктор не по умолчанию
  2. Основы вашего класса незаставить ваш конструктор выполнять работу, связанную с подготовкой для обработки виртуальных функций, виртуальных базовых классов или их собственных нетривиальных конструкторов
  3. Элементы данных вашего класса не заставляют ваш конструктор выполнять работу, связанную с вызовом их собственных неТривиальные конструкторы

Эти правила, взятые вместе, означают, что конструктору нечего делать, следовательно, он тривиален .

В случае X онвсе зависит от элементов данных: если у них всех есть тривиальные конструкторы, и если вы сами не предоставили нетривиальный конструктор, X также будет иметь тривиальный конструктор.

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