Согласно документу , в котором говорится, что [выделено мной]:
Отсутствуют инициализаторы в списке инициализаторов
Если агрегат инициализирован, но количество значений инициализации меньше числа членов, то все оставшиеся члены инициализируется пустым списком инициализаторов. В большинстве случаев это будет выполнить инициализацию значений для этих членов.
Как это правильно понять? Как оставшиеся члены инициализируются пустым списком инициализаторов?
В документе говорится, что в большинстве случаев это будет выполнять инициализацию значений для этих членов. Когда это не так?
Возможно, это проще понять с помощью простого примера кода:
#include <iostream>
struct S {
int a;
int b;
};
int main() {
S s = { 0 };
S s1{ 0 };
//the output will be always zeros?
std::cout<<"s.a = " <<s.a <<", s.b = " <<s.b<<std::endl;
std::cout<<"s1.a = "<<s1.a<<", s1.b = "<<s1.b<<std::endl;
}
Обязательно Кошмар инициализации в C++ Николая Джосуттиса. Часовая презентация о болевых точках синтаксиса инициализации в C++.
@Eljay Так что просто игнорировать их - лучший выбор? :) Есть ли какие-нибудь упрощенные правила, которые можно легко освоить? Точно так же, как это.
Лучший выбор — знать их все и по соглашению (вы или ваша команда) выбрать стиль. Не существует упрощенных правил, которые было бы легко освоить, поскольку это противоположно C++.





Как оставшиеся члены инициализируются пустым списком инициализаторов?
Точно так же, как A a = {}; (см. [dcl.init.aggr] п5.2).
Эта инициализация члена не эквивалентна инициализации значения, когда член относится к типу класса, у которого нет конструктора по умолчанию (который вызывается, если он существует; см. [dcl.init.list] стр. 3.5 ), но имеет конструктор, принимающий std::initializer_list (который называется иначе; см. [dcl.init.list] стр. 7).
struct A {
A(std::initializer_list<int>) {} // #1
};
A a = {}; // calls #1
struct B {
int x;
A a;
};
B b = {42}; // b.a is initialized by calling #1
Спасибо за быстрый ответ. Что такое пустой список инициализаторов? Это {}?
@Джон Да { }
Если я правильно вас понял, demo.y гарантированно будет {} (т. е. 0 для int{}) для struct Demo{int x, int y}; Demo demo = {42};? Я прав?
@Джон Верно. Поскольку int не имеет конструктора списка инициализаторов, выполняется инициализация значения.
@cpplearner Это может вас беспокоить. Но я должен сказать, что вы сэкономите мне часы. Большое спасибо.
Рекомендуем к просмотру: Тимур Думлер: Инициализация в современном C++. Это поразит вас и заставит вас заплакать одновременно.