Я пытаюсь понять точное поведение инициализации значения T()
или T{}
для типа класса T
в C ++ 11.
Меня смущает то, что эти два фрагмента взяты из http://en.cppreference.com:
Инициализация значения:
Эффекты инициализации значения:
[...]
1) если T является типом класса с без конструктора по умолчанию или с предоставленным пользователем или удаленным конструктором по умолчанию , объект инициализируется по умолчанию;
(начиная с C ++ 11)
[...]
так что я посмотрел Default-Initialization :
Эффекты инициализации по умолчанию:
- если T является [...] типом класса, конструкторы рассматриваются и подвергаются разрешению перегрузки для пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию ) вызывается для предоставления начального значения для нового объекта;
[...]
Таким образом, это в основном говорит о том, что если T является типом класса и его неявный конструктор по умолчанию недоступен, то объект будет создан путем вызова одного из его конструкторов по умолчанию? В моем понимании, это имеет смысл только для упомянутого случая предоставленного пользователем конструктора по умолчанию; затем, при построении, будет выполнено только то, что явно указано в этом конструкторе, и каждый элемент, не инициализированный явно, будет инициализирован по умолчанию (пожалуйста, исправьте меня, если я здесь не прав).
Мои вопросы:
1) Что бы произошло, если бы не было предоставленного пользователем конструктора по умолчанию и не было конструктора по умолчанию или он был удален? Я думаю, код не будет компилироваться. Если это правильно, то:
2) Зачем также явно упоминать о случаях "нет конструктора по умолчанию" и "удаленного конструктора по умолчанию"?