Явная инициализация элементов struct/class

struct some_struct{
    int a;
};
some_struct n = {};

n.a после этого будет 0;

Я знаю, что эта фигурная скобка формы инициализации наследуется от C и поддерживается для совместимости с C-программами, но это только компилируется с С++, а не с C-компилятором. Я использую Visual С++ 2005.

В C этот тип инициализации

struct some_struct n = {0};

является правильным и будет нулевым инициализировать всех членов структуры.

Является ли пустая пара фигурных скобок формой стандартизации инициализации? Я впервые увидел эту форму инициализации в учебнике WinAPI из msdn.

Ответы

Ответ 1

Пустая форма инициализации фигурных скобок является стандартной в С++ (она явно разрешена грамматикой). См. C Инициализация статического массива - насколько подробно я должен быть? для получения более подробной информации, если вам интересно.

Я предполагаю, что он был добавлен в С++, потому что может быть нецелесообразно использовать значение 0 для значения init по умолчанию во всех ситуациях.

Ответ 2

Он стандартный в С++, он не в C.

Синтаксис был введен в С++, потому что некоторые объекты не могут быть инициализированы с помощью 0, и не было бы общего способа выполнения инициализации значений массивов.

Ответ 3

Очевидно, что {0} - C99.

Другой способ инициализации в C89 и С++ - это "трюк":

struct some_struct {   int a; };

static some_struct zstruct;

some_struct n = zstruct;

Это использует тот факт, что статические переменные предварительно инициализируются 0-й памятью, что противоречит объявлениям в стеке или куче.