Инициализатор массива C++
В проекте стандарта C++ 14 есть два упоминания (которые я нашел) относительно инициализации массива:
- Раздел 8.5.1 ([dcl.init.aggr]) пункт 2:
"Когда агрегат инициализируется списком инициализаторов [...]"
- Раздел 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) не применяется к массивам, поэтому возможны следующие варианты:
- Инициализация по умолчанию ( [dcl.init] / 12):
int x[3];
- Инициализация значения ( [dcl.init] /17.4):
int* x = new int[3]();
- Инициализация списка ( [dcl.init] /17.1):
int x[] = {1, 2, 3};
или жеint x[] {1, 2, 3};
- Инициализация строковым литералом ( [dcl.init] /17.3):
char x[] = "text";