C++中的嵌套初始值设定项列表为空
Empty nested initializer list in C++
考虑这段代码:
struct S {
float b;
int a;
};
int main() {
S s{{{}}};
return s.a;
}
戈博尔特
Clang 6.0.0编译此代码,但显示警告:
<来源>警告:标量初始值设定项周围的大括号太多 [-Wmany-大括号-周围-标量-init]来源>
GCC 8.2不会编译此代码并报告错误:
哪一个是正确的?规范对此有何规定?
两个编译器都是正确的。 除非违反不需要诊断的规则,否则编译器应向您发出消息。 该消息是警告还是错误取决于实现。 通常,如果编译器仍然可以继续处理,则会收到警告,并且在编译器无法继续时出现错误。
规范对此有何规定?
dcl.init.aggr/3:
3 当聚合由 [dcl.init.list] 中指定的初始值设定项列表初始化时,初始值设定项列表的元素将作为聚合元素的初始值设定项。聚合的显式初始化元素确定如下:
3.1 如果初始值设定项列表是指定的初始值设定项列表,则聚合应为类类型,每个指示符中的标识符应命名该类的直接非静态数据成员,并且聚合的显式初始化元素是作为或包含这些成员的元素。
3.2 如果初始值设定项列表是初始值设定项列表,则聚合的显式初始化元素是聚合的前 n 个元素,其中 n 是初始值设定项列表中的元素数。
3.3否则,初始值设定项列表必须为 {},并且没有显式初始化的元素。
相关文章:
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 嵌套列表,用于在 C++ 中实现邻接列表
- C++中的嵌套初始值设定项列表为空
- 使用"auto"推断嵌套初始值设定项列表的类型
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 嵌套的大括号括起来的初始值设定项列表
- C2436 '{ctor}':构造函数初始值设定项列表中的成员函数或嵌套类
- 使用 Boost.Spirit 解析嵌套列表
- 嵌套列表(字符串向量的向量)初始化失败
- 如何编写嵌套的初始分散列表,例如qpairs的qVector
- C++:将 Args && ... _args传递到嵌套列表的正确方法?
- 如何在嵌套列表初始化中从map<><>中辨别向量?
- 嵌套的C 常数数据结构,没有初始化列表或明确命名所有节点-VC 2012过早破坏了内部元素
- 显式构造函数和嵌套初始值设定项列表
- C++ 初始化构造函数初始化列表中的嵌套结构?
- C 中的嵌套双链接列表
- C :嵌套结构的平面初始化列表
- 使用父类构造函数初始化列表中的嵌套类字段中设置值
- 缩减嵌套模板的类型变量非类型列表
- 从您嵌套的列表中删除