为什么带括号()的数组初始化被编译器标记为错误?
我正在研究 C++ 中的初始化语法,根据cppreference,有三种可能的编写方式,1)括号,2)等号,3)大括号。
尝试使用 1) 括号语法初始化数组时,遇到错误。
int test() {
int a[](1);
return 0;
}
在 Compiler Explorer 上测试,我从 clang 11.0.0 获得
error: array initializer must be an initializer list
int a[](1);
^
同样,在与 gcc 10.2 相同的站点上
error: array must be initialized with a brace-enclosed initializer
现在,我知道如何使用大括号来初始化数组而不会出错。但这不是这个问题的重点。
我正在寻找与此报告的错误对应的 C++ 标准。
我正在查看这个标准草案timsong-cpp(应该在 C++ 20 时代左右)。“(17.1) If the initializer is a (non-parenthesized) brad-init-list or is =braced-init-list, ...”一节讨论了花括号列表——不是我们的情况。
然后有一段“(17.5)否则,如果目标类型是数组,则对象初始化如下……”
我认为这应该涵盖我们的情况。它是关于数组的初始化,它也是一个“其他”部分,这意味着它不会谈论花括号列表。它可以谈论 1) 括号或 2) 等号,但从进一步的文本中我们看到它需要一个表达式列表:
“让 x1, ..., xk 是表达式列表的元素。”
使用 1) 括号语法时,该表达式列表将在那里。作为旁注,“14 If the entity is being initialized ...”部分要求表达式列表在这种情况下只能是单个表达式。
根据标准措辞,声明int a[](1);应该将数组的长度设置为 1 并将其唯一的元素初始化为值 1。但这在实现中不会发生。
标准的哪些其他部分可以阻止这种解释?或者还有什么我想念的吗?
回答
您尝试使用的功能是在 C++20 中添加的,称为“聚合的括号初始化”。从编译器支持页面可以看出,GCC 从 GCC10 开始支持此功能,而 Clang 尚不支持此功能。