Инициализация нестатических данных

Существуют ли различия между следующими тремя определениями структуры в соответствии со стандартом С++?

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 отличается.

Для получения дополнительной информации вы можете прочитать Initialization и Инициализация члена класса

Ответ 3

Первый - это тип POD. Член a инициализируется 0.