Допустимость int * array = new int [size] (); - PullRequest
5 голосов
/ 17 ноября 2009
int * array = new int [size]();

Оператор () позволяет установить все значения массива на 0 (все биты на 0). это называется инициализация значения.

С какой версией g ++ она действительна?

А как насчет других компиляторов?

Где его можно найти в стандарте?

Ответы [ 3 ]

6 голосов
/ 17 ноября 2009

Это часть стандарта C ++; если он был недействительным в g ++, то g ++ не соответствовал. Из стандарта C ++ (ISO / IEC 14882: 2003) несколько разделов имеют отношение:

5.3.4 / 15 относительно нового выражения говорит:

Если новый инициализатор имеет форму (), элемент инициализируется значением

8.5 / 5 относительно инициализаторов говорит:

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

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

- если T является типом класса, не являющимся объединением, без объявленного пользователем конструктора, то каждый нестатический член данных и компонент базового класса в T инициализируется значением;

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

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

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

1 голос
/ 17 ноября 2009

Инициализация с () (включая ваш пример) всегда была частью стандарта C ++, начиная с C ++ 98. Хотя в новых версиях стандарта произошли некоторые изменения, они не относятся к вашему примеру.

Компиляторы GCC, как известно, неправильно обрабатывали инициализаторы () в версиях из семейства 2.x.x. Известно, что компилятор MSVC ++ неправильно обрабатывает инициализаторы () в VC6. Более новые версии MSVC ++ обрабатывают () инициализаторы в соответствии со спецификацией C ++ 98.

0 голосов
/ 17 ноября 2009

Это из "Рабочего проекта, стандарта для программирования Язык С ++ "от 2009-11-09:

8.5 Инициализаторы
...
7 Инициализировать значение объекта типа T означает:

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

...

...