Существуют ли различия между следующими тремя определениями структуры в соответствии со стандартом С++?
struct Foo
{
int a;
};
struct Foo
{
int a{};
};
struct Foo
{
int a{0};
};
Последние два являются С++ 11.
Ответ 1
Учитывая первое определение, если вы создаете экземпляр Foo с автоматическим временем хранения, a будет неинициализирован. Вы можете выполнить инициализацию агрегата для его инициализации.
Foo f{0}; // a is initialized to 0
Второе и третье определения Foo будут инициализировать член данных a до 0.
В С++ 11 ни 2, ни 3 не являются агрегатами, но С++ 14 изменяет это правило, так что они оба сохраняют агрегаты, несмотря на добавление инициализатора скобок или равного.
Ответ 2
struct Foo
{
int a;
}bar;
bar.a не инициализируется, если нет в глобальной области видимости или не статично.
struct Foo
{
int a{};
}bar;
bar.a инициализируется 0
struct Foo
{
int a{0};
}bar;
bar.a инициализируется 0
Таким образом, конструкции 2 и 3 одинаковы. 1 отличается.