Является ли std:: array <int, 10> как член класса zero-initialized?
struct MyClass
{
std::array<int, 10> stdArr;
MyClass() : stdArr()
{}
};
MyClass c;
Вопросы:
- Является ли
c.stdArr
нулевым инициализированным?
- Если да - почему?
Мои собственные противоречивые ответы:
-
Он инициализируется нулем:
std::array
хочет вести себя как c-массив.
Если в моем примере выше stdArr
был c-массив, он был бы нулевым инициализирован stdArr()
в списке инициализации. Я ожидаю, что запись member()
внутри списка инициализации инициализирует объект.
-
Не инициализируется нулем:
-
std::array
обычно имеет один элемент, который в моем случае int[10] _Elems;
- обычно основные типы и массивы основных типов, таких как
int[N]
, не инициализируются по умолчанию.
-
std::array
- это тип агрегата, который подразумевает, что он сконфигурирован по умолчанию.
- потому что нет настраиваемого конструктора, который инициализирует
_Elems
, я думаю, что он не инициализирован нулем.
Какое правильное поведение std::array
соответствует стандарту С++ 11?
Ответы
Ответ 1
Является ли c.stdArr
нулевым инициализированным?
Да
Если да - почему?
Это выполняет инициализация значения stdArr
:
MyClass() : stdArr() {}
В этом контексте эффект инициализации значения представляет собой нулевая инициализация объекта.
Изменить: в имеется много релевантной информации > Что такое агрегаты и POD...?
Ответ 2
"std:: array хочет вести себя как c-массив" не так, как стандарт описывает поведение. Это пользовательский тип, а члены пользовательских типов инициализируются путем вызова их конструктора, то есть array<int,10>::array()