#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