Я думаю, что стандарт просто означает «если T
- это тип класса с удаленным конструктором по умолчанию, тогда переходите к инициализации по умолчанию». В конце концов он потерпит неудачу, потому что конструктор, выбранный для инициализации по умолчанию, будет удален. Он используется для различения со вторым случаем, т. Е. «Если T
является типом класса с конструктором по умолчанию, который не предоставлен и не удален пользователем», для этого случая сначала выполняется нулевая инициализация, затем инициализация по умолчанию, если T
имеет нетривиальный конструктор по умолчанию.
A a{}
нормально, но почему?
Потому что, когда A
представляет собой тип агрегата , выполняется инициализация агрегата. Обратите внимание, что явно удаленные конструкторы разрешены для агрегатного типа начиная с C ++ 11.
Во всех случаях, если используется пустая пара фигурных скобок {} и T является агрегатным типом, вместо инициализации значения выполняется инициализация агрегата.
И
Агрегат относится к одному из следующих типов:
- тип массива
- тип класса (обычно struct или union), который имеет
- нет личных или защищенных нестатических элементов данных
- нет предоставленных пользователем
, inherited, or explicit (since C++17)
конструкторов (explicitly defaulted or deleted constructors are allowed) (since C++11)