初始化union的多个非静态数据成员

时间:2016-08-20 18:05:39

标签: c++ c++11 initialization unions member-initialization

考虑按照标准生成的程序

jquery.js

C ++ 11标准N3376第12节第6.2.8节说(强调我的):

  

尝试初始化a的多个非静态数据成员   union将程序格式错误

但所有流行的3个编译器(g ++,clang ++,MSVC ++)编译上面的程序而不会产生任何编译器错误或警告。我认为编译器有必要在这个程序中进行诊断。程序在编译时应该失败。

查看在g ++ here上测试的现场演示。

查看在clang ++ here上测试的现场演示。

根据标准,所有编译器都在这里打破了吗?这个编译器错误吗?

2 个答案:

答案 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是构造函数

的参数,所以不会形成错误