Подтвердить что ты не робот

Является ли 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?

4b9b3361

Ответ 1

Является ли c.stdArr нулевым инициализированным?

Да

Если да - почему?

Это выполняет инициализация значения stdArr:

MyClass() : stdArr() {}

В этом контексте эффект инициализации значения представляет собой нулевая инициализация объекта.

Изменить: в имеется много релевантной информации > Что такое агрегаты и POD...?

Ответ 2

"std:: array хочет вести себя как c-массив" не так, как стандарт описывает поведение. Это пользовательский тип, а члены пользовательских типов инициализируются путем вызова их конструктора, то есть array<int,10>::array()