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

时间:2013-07-22 14:33:25

标签: c++ c++11 unions in-class-initialization

最小代码示例:

struct B { 
  union U {
    struct S {} s;
    int i = 100;
  }
  u;  
};

现在,如果我们声明B obj;,则会为obj.u.i分配垃圾值而不是100。请参阅demo here。 (垃圾值因优化标志等而异。)。

“In class initialization”功能是否适用于工会。

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

2 个答案:

答案 0 :(得分:3)

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

  

联合的最多一个非静态数据成员可能有一个大括号或等于初始化程序

否则,规则与普通类相同。

编辑:此外,12.6.2p8:

  

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

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

据推测,隐式定义的默认构造函数在这里计算。 i成员符合第一个项目符号点中的条件,因此它被初始化为普通类成员。 <{1}}成员与第二个项目符号点匹配,因此它未被初始化。

答案 1 :(得分:2)

我认为这就是因为工会重新组合了不止一个元素。以下是关于语法的解决方法:

struct B { 
  union U {
    int i;
  }
  u {100};  
};

int main () {
  B obj;
  std::cout << "obj.u.i = " << obj.u.i << "\n";
}