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

Why is array initialization with brackets () marked as error by compilers?

我在研究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)部分 如果初始值设定项是(非括号化的)花括号初始化列表或 = 花括号初始化列表,..." 谈论花括号列表 - 不是我们的情况。

然后还有一段"(17.5) 否则,如果目标类型是数组,则对象初始化如下 ..."

我认为这应该涵盖我们的案例。它是关于数组的初始化,它也是一个“其他”部分,这意味着它不会谈论大括号列表。它可以讨论 1) 括号或 2) 等号,但从进一步的文本我们看到它需要一个表达式列表:

“设 x1, …, xk 为表达式列表的元素。”

当使用 1) 括号语法时,该表达式列表将在那里。作为旁注,“14 如果正在初始化的实体......”部分要求表达式列表在这种情况下只能是单个表达式。

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

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

您尝试使用的功能是在 C++20 中添加的,称为“Parenthesized initialization of aggregates”。从compiler support页面可以看出,GCC从GCC10开始支持这个功能,而Clang还不支持这个功能。