C++ 11"在类初始化"功能不适用于工会

iam*_*ind 9 c++ unions in-class-initialization c++11

最小代码示例:

struct B { 
  union U {
    struct S {} s;
    int i = 100;
  }
  u;  
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我们声明一个B obj;,obj.u.i则分配一个垃圾值而不是100.请在此处查看演示.(垃圾值根据优化标志等而不同).

"类初始化"功能是否适用于联合.

  • 如果是,那么正确的语法是什么?或者这是一个g ++错误?
  • 如果不是那么呢int i = 100;

Joh*_*esD 3

这看起来像一个 GCC 错误。标准说(9.5p2):

联合体中至多一个非静态数据成员可以具有大括号或等于初始化程序

除此之外,规则与常规课程相同。

编辑:此外,12.6.2p8:

在非委托构造函数中,如果给定的非静态数据成员或基类不是由mem-initializer-id指定的(包括由于构造函数没有ctor-initializer而没有mem-initializer-list 的情况 )并且实体不是抽象类的虚拟基类(10.4),那么

  • 如果该实体是具有大括号或等于初始化器的非静态数据成员,则该实体按照 8.5 中的指定进行初始化;
  • 否则,如果实体是变体成员(9.5),则不执行初始化;
  • 否则,该实体将被默认初始化(8.5)。

据推测,隐式定义的默认构造函数在这里计数。该i成员满足第一个要点中的标准,因此它像常规类成员一样被初始化。该s成员与第二个要点匹配,因此它未初始化。