Гарантировано ли, что пропущенные поля при инициализации, назначенной C 20, будут инициализированы нулем?

#c #c 20

#c #c 20

Вопрос:

При использовании инициализаторов, назначенных C 20, не требуется указывать значение для каждого поля:

 struct Foo
{
    int i;
    void* p;
};
 

может быть инициализировано следующим образом:

 Foo bar = {
    .i = 22
};
 

Инициализированы ли пропущенные поля с нулевой инициализацией? Итак, в этом примере p гарантированно установлено значение nullptr ?

Ответ №1:

Инициализированы ли пропущенные поля с нулевой инициализацией?

В этом случае да. Правило (из [dcl.init]/5):

Для агрегата без объединения каждый элемент, который не является явно инициализированным элементом, инициализируется следующим образом:

  • Если элемент имеет инициализатор элемента по умолчанию ([class.mem] ), элемент инициализируется из этого инициализатора.
  • В противном случае, если элемент не является ссылкой, элемент инициализируется копированием из пустого списка инициализаторов ([dcl.init.list] ).
  • В противном случае программа будет неправильно сформирована.

В этом случае p явно не инициализируется. У него нет инициализатора элемента по умолчанию, поэтому мы переходим ко второму пункту. Это не ссылка, поэтому она инициализируется копированием {} . Для a void* это инициализация с нулевым значением.

Ответ №2:

Пропущенные поля являются:

инициализаторы элементов по умолчанию, где они предусмотрены, пустой список-инициализация в противном случае

источник: https://en.cppreference.com/w/cpp/language/aggregate_initialization