为什么编译器将带括号 () 的数组初始化标记为错误?
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还不支持这个功能。
我在研究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还不支持这个功能。