std::array
является агрегатным типом, тип является агрегатным типом, если он не имеет закрытых или защищенных прямых нестатических элементов данных, предоставленных пользователем конструктора, виртуальной функции и виртуальных, частных или защищенных базовых классов, например
struct S
{
int arr[5];
};
Так что это может быть инициализировано как S s = { 0, 1, 2, 3, 4};
здесь элемент s.arr
получить копию инициализации с помощью braced-init-list. Точно так же std::array
также является агрегатным типом и все следующие различные синтаксисы,
std::array< int, 5> arr{ { 0, 1, 2, 3, 4}}; // double-braces required in C++11 prior to the CWG
std::array< int, 5> arr{ 0, 1, 2, 3, 4};
std::array< int, 5> arr = { 0, 1, 2, 3, 4};
запускает агрегатную инициализацию, и в них нет никакой разницы. Даже его можно инициализировать следующим образом
std::array< int, 5> arr = {};
std::array< int, 5> arr = { 0, 1, 2};
В случае пустого списка {}
элементы arr
должны быть инициализированы и иметь следующее значение [ 0, 0, 0, 0, 0]
, а в случае списка, содержащего меньше элементов { 0, 1, 2}
, тогда первые 3 элемента arr
должны быть инициализированы копией из braced-init-list и оставшихся элементов должно быть значение initialize, а конечное значение будет [ 0, 1, 2, 0, 0]
Пожалуйста, проверьте более подробную информацию на Совокупная инициализация