Инициализация значения объекта класса без конструктора по умолчанию - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь понять точное поведение инициализации значения T() или T{} для типа класса T в C ++ 11. Меня смущает то, что эти два фрагмента взяты из http://en.cppreference.com:

Инициализация значения:

Эффекты инициализации значения: [...]

1) если T является типом класса с без конструктора по умолчанию или с предоставленным пользователем или удаленным конструктором по умолчанию , объект инициализируется по умолчанию; (начиная с C ++ 11)

[...]

так что я посмотрел Default-Initialization :

Эффекты инициализации по умолчанию:

  • если T является [...] типом класса, конструкторы рассматриваются и подвергаются разрешению перегрузки для пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию ) вызывается для предоставления начального значения для нового объекта;

[...]

Таким образом, это в основном говорит о том, что если T является типом класса и его неявный конструктор по умолчанию недоступен, то объект будет создан путем вызова одного из его конструкторов по умолчанию? В моем понимании, это имеет смысл только для упомянутого случая предоставленного пользователем конструктора по умолчанию; затем, при построении, будет выполнено только то, что явно указано в этом конструкторе, и каждый элемент, не инициализированный явно, будет инициализирован по умолчанию (пожалуйста, исправьте меня, если я здесь не прав).

Мои вопросы:

1) Что бы произошло, если бы не было предоставленного пользователем конструктора по умолчанию и не было конструктора по умолчанию или он был удален? Я думаю, код не будет компилироваться. Если это правильно, то:

2) Зачем также явно упоминать о случаях "нет конструктора по умолчанию" и "удаленного конструктора по умолчанию"?

1 Ответ

0 голосов
/ 13 мая 2018

Формулировка cppreference, похоже, не соответствует стандарту. C ++ 11 8,5 / 7 [dcl.init]:

К значение-инициализация объект типа T означает:

  • если T является (возможно, cv-квалифицированным) типом класса (раздел 9) с предоставленным пользователем конструктором (12.1), то вызывается конструктор по умолчанию для T (и инициализация некорректна, если T не имеет доступного по умолчанию конструктор);
  • если T является (возможно, cv-квалифицированным) типом класса без объединения без предоставленного пользователем конструктора, тогда объект инициализируется нулями, и если неявно объявленный конструктор по умолчанию T является нетривиальным, этот конструктор называется.
  • если T является типом массива, то каждый элемент инициализируется значением;
  • в противном случае объект инициализируется нулями.

Объект, инициализированный по стоимости, считается созданным и, таким образом, подпадающим под положения настоящего Международного Стандартное применение к «построенным» объектам, объектам, «для которых конструктор выполнил» и т. Д., даже если для инициализации объекта не вызывается конструктор.

Для сравнения, это формулировка в C ++ 14 (n4140) 8.5 / 7 [dcl.init]:

К значение-инициализация объект типа T означает:

  • , если T - это (возможно, cv-квалифицированный) тип класса (раздел 9) без конструктора по умолчанию (12.1) или конструктор по умолчанию, который предоставляется или удаляется пользователем, затем объект инициализируется по умолчанию;
  • если T является (возможно, cv-квалифицированным) типом класса без предоставленного пользователем или удаленного конструктора по умолчанию, тогда объект инициализируется нулем, и проверяются семантические ограничения для инициализации по умолчанию, и если T имеет нетривиальный конструктор по умолчанию, объект инициализируется по умолчанию;
  • если T является типом массива, то каждый элемент инициализируется значением;
  • в противном случае объект инициализируется нулями.

Объект, инициализированный по стоимости, считается созданным и, таким образом, подпадающим под положения настоящего Международного Стандартное применение к «построенным» объектам, объектам, «для которых конструктор выполнил» и т. Д., даже если для инициализации объекта не вызывается конструктор.

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