Это происходит от 8.5/16
первого маркера до 8.5.4
списка инициализации и от 8.5.4/3
третьего маркера до 8.5.1
агрегированной инициализации, а затем 8.5.1/4
говорит
Массив неизвестного размера, инициализированный заключенным в скобки списком инициализаторов, содержащим n предложений инициализатора, где должно быть больше нуля, определяется как имеющий элементы
Единственное отличие, если объект представляет собой массив между = { ... }
и { ... }
, заключается в том, что первый из них называется copy-list-initialization , а второй называется direct-list-initialization , так что оба вида инициализации списка. Элементы массива инициализируются копией из элементов списка инициализатора в обоих случаях.
Обратите внимание, что между этими формами есть небольшая разница, если массив имеет размер, а список пуст, в этом случае применяется 8.5.4
второй маркер:
struct A {
explicit A();
};
A a[1]{}; // OK: explicit constructor can be used by direct initialization
A a[1] = {}; // ill-formed: copy initialization cannot use explicit constructor
Это различие не применяется к спискам, в которых есть контент, и в этом случае третий пункт применяется снова, хотя
struct A {
explicit A(int);
};
A a[1]{0}; // ill-formed: elements are copy initialized by 8.5.1
A a[1] = {0}; // ill-formed: same.
FCD изменил это по сравнению с предыдущим проектом, и инициализация с пустым списком инициализатора теперь всегда работает даже с явными конструкторами по умолчанию. Это связано с тем, что FCD заявляет, что элементы инициализируются значением, а инициализация значения не заботится о явности, поскольку она не выполняет разрешение перегрузки для конструкторов по умолчанию (в любом случае она не может выяснить, лучше или хуже совпадения). Предыдущий проект использовал нормальное разрешение перегрузки для конструкторов и, таким образом, отклонял явные конструкторы по умолчанию во время инициализации копирования. Этот отчет о дефектах сделал это изменение.