C++数组初始值设定项

C++ array initializer

本文关键字:数组 C++      更新时间:2023-10-16

在 C++ 14 标准草案中,有两个关于数组初始化的提及(我发现(:

  1. 8.5.1 节 ([dcl.init.aggr]( 第 2 段:

"当聚合由初始值设定项列表初始化时 [...]">

  1. Section 8.5.2 ([dcl.init.string]( 第 1 段:

"可以初始化窄字符类型 (3.9.1(、char16_t数组、char32_t数组或wchar_t数组的数组 通过窄字符串文本、char16_t字符串文本、char32_t字符串文本或宽字符串文本, 分别,或用大括号括起来的适当类型的字符串文本 (2.13.5(。[...]">

因此,至少有两种类型的初始值设定项可用于数组:初始值设定项列表和字符串文本。

标准是否明确提到这是仅有的两个选项?

[dcl.init] 的第 17 段指定了数组所有可能的初始值设定项。

17初始值设定项的语义如下。目标类型是要初始化的对象或引用的类型,源类型是初始值设定项表达式的类型。如果初始值设定项不是单个(可能用括号括起来(表达式,则不会定义源类型。

(17.1)如果初始值设定项是(非括号(大括号初始化列表或 is =大括号初始化列表,则对象或引用是列表初始化的。

(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";