Инициализация по умолчанию типов классов POD и не POD - PullRequest
4 голосов
/ 24 ноября 2011

Стандарт C ++ гласит (8.5 / 5):

По умолчанию инициализировать объект типа T означает:

  • Если T является типом класса, отличного от POD (пункт 9), вызывается конструктор по умолчанию для T (и инициализация некорректна, если T не имеет доступный конструктор по умолчанию).

  • Если T является типом массива, каждый элемент инициализируется по умолчанию.

  • В противном случае объект инициализируется нулями.

С этим кодом

struct Int { int i; };

int main()
{
    Int a;
}

объект a инициализируется по умолчанию, но ясно, что a.i не обязательно равен 0. Разве это не противоречит стандарту, поскольку Int является POD, а не массивом?

Редактировать Изменено с class на struct, так что Int является POD.

Ответы [ 3 ]

6 голосов
/ 24 ноября 2011

Начиная с 8.5.9 стандарта 2003 года:

Если для объекта не указан инициализатор, и объект относится к (возможно, cv-квалифицированному) типу класса, отличному от POD (или его массиву)) объект должен быть инициализирован по умолчанию;если объект имеет константный тип, базовый тип класса должен иметь объявленный пользователем конструктор по умолчанию. В противном случае, если для нестатического объекта не указан инициализатор, объект и его подобъекты, если таковые имеются, имеют неопределенное начальное значение );если объект или любой из его подобъектов имеют константный тип, программа имеет некорректную форму.

Класс, который вы показываете, является POD, поэтому выделенная часть применяется, и ваш объект не будетбыть инициализированным вообще (поэтому раздел 8.5 / 5, который вы цитируете, вообще не применяется).

Редактировать: Согласно вашему комментарию, здесь цитата из раздела 8.5 / 5окончательный рабочий проект текущего стандарта (у меня нет реального стандарта, но FDIS предположительно очень близок):

Инициализация по умолчанию объекта типа T означает:

- если T является (возможно, cv-квалифицированным) типом класса (раздел 9), вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию);

- если T является типом массива, каждый элемент инициализируется по умолчанию;

- в противном случае инициализация не выполняется.

1 голос
/ 24 ноября 2011

Ваша переменная не инициализирована. Используйте

Int a = Int();

чтобы инициализировать ваш POD или объявить стандартный конструктор, чтобы сделать его не POD; Но вы также можете использовать свой POD неинициализированным по причинам производительности, таким как:

Int a;
a.i = 5;
0 голосов
/ 24 ноября 2011

Нет, объект a не инициализирован по умолчанию. Если вы хотите инициализировать его по умолчанию, вы должны сказать:

Int a = Int() ;
...