Предположим, у меня есть шаблон класса, в котором есть член std::array
:
template<typename T>
class C {
public:
C();
private:
std::array<T, 42> a;
};
Как определить C::C
так, чтобы a
всегда было инициализировано значением (не инициализировано по умолчанию) )? ie так, что конструктор вызывает T()
для инициализации каждого элемента a
- и что, например, если T
равно int
, то каждый элемент a
гарантированно равен нулю, а не неопределенное значение?
int main() {
C<int> c;
assert(c.a[13] == 0); // ignoring private for exposition
}
ОБНОВЛЕНИЕ
Дополнительная информация для потомков:
std::array
- это агрегатный тип с одним элементом T[N]
- Инициализация
std::array
списком инициализации - это совокупная инициализация - Совокупная инициализация с пустым списком инициализации приводит к тому, что каждый элемент не инициализируется явным образом. Такие элементы инициализируются как бы путем инициализации копирования из пустого списка инициализации.
- Массив
T[N]
инициализируется копией из пустого списка инициализации. Это также совокупность, поэтому 2 и 3 применяются рекурсивно. - Каждый из N элементов
T[N]
инициализируется копией из пустого списка инициализации. - Каждый объект T копируется список инициализируется с пустым списком инициализации согласно
[dcl.init.list]/3
. Достигнуто последнее предложение этой цепочки, которое гласит:
В противном случае, если в списке инициализатора нет элементов, объект инициализируется значением.
и вуаля. Инициализация std::array
с пустым списком инициализации {}
приводит к инициализации его элементов.