在C ++ 14标准draft中,有两个关于数组初始化的提及(我发现):
"当聚合由初始化列表[...]"
初始化时
"可以初始化窄字符类型(3.9.1),char16_t数组,char32_t数组或wchar_t数组的数组 通过一个窄字符串文字,char16_t字符串文字,char32_t字符串文字或宽字符串文字, 分别或用括号中的适当类型的字符串文字(2.13.5)。 [...]"
因此,至少有两种类型的初始值设定项可用于数组:初始化列表和字符串文字。
标准是否明确提到这些是唯一两个选项?
答案 0 :(得分:1)
[dcl.init]指定了数组的所有可能的初始值设定项。
17
初始值设定项的语义如下。目标类型是要初始化的对象或引用的类型,源类型是初始化表达式的类型。如果初始化程序不是单个(可能带括号的)表达式,则不定义源类型。
(17.1)
如果初始化程序是(非括号内的) braced-init-list 或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)不适用于数组,因此选项为:
int x[3];
int* x = new int[3]();
int x[] = {1, 2, 3};
或int x[] {1, 2, 3};
char x[] = "text";