Инициализатор массива C++

В проекте стандарта C++ 14 есть два упоминания (которые я нашел) относительно инициализации массива:

  1. Раздел 8.5.1 ([dcl.init.aggr]) пункт 2:

"Когда агрегат инициализируется списком инициализаторов [...]"

  1. Раздел 8.5.2 ([dcl.init.string]) пункт 1:

"Массив типа узкого символа (3.9.1), массив char16_t, массив char32_t или массив wchar_t могут быть инициализированы узким строковым литералом, строковым литералом char16_t, строковым литералом char32_t или широким строковым литералом, соответственно, или соответствующим образом строковый литерал, заключенный в фигурные скобки (2.13.5). [...]"

Поэтому существует как минимум два типа инициализаторов, которые можно использовать для массивов: списки инициализаторов и строковые литералы.

Стандарт прямо упоминает, что это только два варианта?

1 ответ

Решение

В параграфе 17 [dcl.init] указаны все возможные инициализаторы для массивов.

17 Семантика инициализаторов следующая. Тип назначения - это тип инициализируемого объекта или ссылки, а тип источника - тип выражения инициализатора. Если инициализатор не является одним (возможно, заключенным в скобки) выражением, тип источника не определен.

(17.1) Если инициализатором является (не заключенный в скобки) фигурный список инициализации или is = braced-init-list, объект или ссылка инициализируются списком.

(17.2) Если тип назначения является ссылочным типом, см. [Dcl.init.ref].

(17.3) Если тип назначения представляет собой массив символов, массив char16_t, массив char32_t или массив wchar_t, а инициализатор является строковым литералом, см. [Dcl.init.string].

(17.4) Если инициализатором является (), объект инициализируется значением.

(17.5) В противном случае, если тип назначения является массивом, программа является некорректной.

(17.2) не применяется к массивам, поэтому возможны следующие варианты:

  1. Инициализация по умолчанию ( [dcl.init] / 12): int x[3];
  2. Инициализация значения ( [dcl.init] /17.4): int* x = new int[3]();
  3. Инициализация списка ( [dcl.init] /17.1): int x[] = {1, 2, 3}; или же int x[] {1, 2, 3};
  4. Инициализация строковым литералом ( [dcl.init] /17.3): char x[] = "text";
Другие вопросы по тегам