为什么编译器将带括号()的数组初始化标记为错误



我正在研究C++中的初始值设定项语法,根据cpprreference,有三种可能的编写方法,1(方括号,2(等号,3(大括号。

当试图用括号语法初始化数组时,我遇到了一个错误。

int test() {
int a[](1);
return 0;
}

在编译器资源管理器上测试,我从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(如果初始值设定项是一个(非括号(brake-init-list或is=brake-int-list"谈论的是备用清单,而不是我们的情况。

然后有一个部分";(17.5(否则,如果目标类型是数组,则对象初始化如下">

我认为这应该涵盖我们的情况。它是关于数组的初始化,也是一个"初始化";否则";部分,这意味着它不会谈论支撑列表。它可以谈论1(括号或2(等号,但从进一步的文本中我们可以看到,它需要一个表达式列表:

"设x1,…,xk是表达式列表的元素">

当使用方括号语法时,该表达式列表就会出现。作为旁注;14如果实体正在初始化"在这种情况下,要求表达式列表只能是单个表达式。

根据标准措辞,声明int a[](1);应该将数组的长度设置为1,并用值1初始化其唯一的元素。但在实现中并没有发生这种情况。

标准的其他哪些部分可以阻止这种解释?或者我还缺少什么?

您尝试使用的功能是在C++20中添加的,称为">聚合的带圆括号初始化";。从编译器支持页面可以看出,GCC从GCC10支持这一功能,而Clang还不支持这一特性。

最新更新