考虑按照标准生成的程序
jquery.js
C ++ 11标准N3376第12节第6.2.8节说(强调我的):
尝试初始化a的多个非静态数据成员 union将程序格式错误。
但所有流行的3个编译器(g ++,clang ++,MSVC ++)编译上面的程序而不会产生任何编译器错误或警告。我认为编译器有必要在这个程序中进行诊断。程序在编译时应该失败。
查看在g ++ here上测试的现场演示。
查看在clang ++ here上测试的现场演示。
根据标准,所有编译器都在这里打破了吗?这个编译器错误吗?
答案 0 :(得分:4)
默认构造函数允许初始化s
成员,因此在那里只初始化了一个成员。
参数化构造函数只初始化f
成员,因此在那里只初始化了一个成员。
每个构造函数只允许初始化一个成员,因此程序格式正确。
来自N4594 (the upcoming C++17 standard)的§12.6.2/ 9:
在非委托构造函数中,如果给定的可能构造的子对象未由 mem-initializer-id 指定(包括没有 mem-initializer-list <的情况) / em>因为构造函数没有 ctor-initializer ),然后
(9.1) - 如果实体是具有默认成员初始值设定项(9.2)且
的非静态数据成员
- (9.1.1) - 构造函数的类是一个union(9.3),并且没有指定该union的其他变体成员 通过 mem-initializer-id ...
[无关文字]
上面引用的内容基本上是 brace-or-equal-initializer 只有在没有 mem-initializer-id 时才会执行。
标准中还有一种语言,表示联盟可能只有一个大括号或等于初始化。
答案 1 :(得分:0)
由于s
是构造函数