C++中的嵌套初始值设定项列表为空

Empty nested initializer list in C++

本文关键字:列表 嵌套 C++      更新时间:2023-10-16

考虑这段代码:

struct S {
float b;
int a;    
};
int main() {
S s{{{}}};
return s.a;
}

戈博尔特

Clang 6.0.0编译此代码,但显示警告:

<来源>警告:标量初始值设定项周围的大括号太多 [-Wmany-大括号-周围-标量-init]

GCC 8.2不会编译此代码并报告错误:

:在函数'int main(('中:<源>:9:10:错误:类型"float"的标量初始值设定项两边的大括号

哪一个是正确的?规范对此有何规定?

两个编译器都是正确的。 除非违反不需要诊断的规则,否则编译器应向您发出消息。 该消息是警告还是错误取决于实现。 通常,如果编译器仍然可以继续处理,则会收到警告,并且在编译器无法继续时出现错误。

规范对此有何规定?

dcl.init.aggr/3:

3 当聚合由 [dcl.init.list] 中指定的初始值设定项列表初始化时,初始值设定项列表的元素将作为聚合元素的初始值设定项。聚合的显式初始化元素确定如下:

3.1 如果初始值设定项列表是指定的初始值设定项列表,则聚合应为类类型,每个指示符中的标识符应命名该类的直接非静态数据成员,并且聚合的显式初始化元素是作为或包含这些成员的元素。

3.2 如果初始值设定项列表是初始值设定项列表,则聚合的显式初始化元素是聚合的前 n 个元素,其中 n 是初始值设定项列表中的元素数。

3.3否则,初始值设定项列表必须为 {},并且没有显式初始化的元素。