问题描述
我在研究 C++ 中的初始化语法,根据 @L_404_0@,有三种可能的写法,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) 如果初始值设定项是(无括号的)花括号初始化器列表或 = 花括号初始化器列表,...”谈论花括号列表 - 而不是我们的情况。
然后是“(17.5) 否则,如果目标类型是数组,则对象初始化如下..."
我认为这应该涵盖我们的情况。它是关于数组的初始化,它也是一个“其他”部分,这意味着它不会谈论花括号列表。它可以谈论 1) 括号或 2) 等号,但从进一步的文本中我们看到它需要一个表达式列表:
“令 x1,...,xk 为表达式列表的元素。”
当使用 1) 括号语法时,该表达式列表将在那里。作为旁注,“14 If the entity is being initialized ...”部分要求表达式列表在这种情况下只能是单个表达式。
根据标准措辞,声明 int a[](1);
应该将数组的长度设置为 1 并使用值 1 初始化其唯一元素。但在实现中不会发生这种情况。
标准的哪些其他部分可以阻止这种解释?或者还有什么我遗漏的吗?
解决方法
您尝试使用的功能是在 C++20 中添加的,称为“带括号的聚合初始化”。从 compiler support 页面可以看出,GCC 从 GCC10 开始支持此功能,而 Clang 尚不支持此功能。