инициализация структуры с {0} - PullRequest
8 голосов
/ 28 октября 2019

Я отлаживаю некоторый код, который по сути идентичен этому:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };

Когда я создаю экземпляр Bar, кажется, что и a, и b инициализируются нулями,Это гарантировано? Где я могу найти это в спецификации?

1 Ответ

3 голосов
/ 28 октября 2019

Согласно cppreference.com

Если количество предложений инициализатора меньше, чем количество членов [и баз (начиная с C ++ 17)] или списка инициализаторовполностью пуст, остальные члены [и базы (начиная с C ++ 17)] инициализируются [их инициализаторами членов по умолчанию, если это предусмотрено в определении класса, и в противном случае (начиная с C ++ 14)] пустыми списками, в соответствиис обычными правилами инициализации списка (которые выполняют инициализацию значений для не-классов и неагрегированных классов с конструкторами по умолчанию, а также агрегатную инициализацию для агрегатов). Если элемент ссылочного типа является одним из этих оставшихся элементов, программа имеет некорректную форму.

Foo не имеет инициализаторов элементов по умолчанию (int b{0};), поэтому b будетинициализируется инициализацией списка пустым списком, что означает инициализацию значения для типов, не относящихся к классу: b = int() // = 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...