Инициализирующие нулями элементы std :: array с инициализатором члена по умолчанию

Предположим, у меня есть шаблон класса, подобный этому:

template<typename T, size_t N>
struct S {
   std::array<T,N> a;
};

Есть ли инициализатор члена по умолчанию я могу разместить на, a

template<typename T, size_t N>
struct S {
   std::array<T,N> a = ???;
};

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

Ответ 1

Это:

template<typename T, size_t N>
struct S {
   std::array<T,N> a = {};
};

Это будет рекурсивно копировать-инициализировать каждый элемент из {}. Для int это будет инициализация нуля. Конечно, кто-то всегда может написать:

struct A {
    A() {}
    int i;
};

что помешало бы i быть инициализированным. Но это на них.

Ответ 2

std::array является агрегатным типом. Вы можете агрегировать инициализировать его с помощью пустых фигурных скобок {} и это будет соответственно инициализировать элементы внутреннего массива T которые содержит std::array.