9

最小代码示例:

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

现在,如果我们声明 aB obj;那么将obj.u.i分配一个垃圾值而不是100. 在此处查看演示。(垃圾值因优化标志等而异)。

“类内初始化”功能是否应该与联合一起使用。

  • 如果是,那么正确的语法是什么?或者这是一个 g++ 错误?
  • 如果没有,那该怎么int i = 100;办?
4

2 回答 2

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成员与第二个要点匹配,因此未初始化。

于 2013-07-22T15:00:56.920 回答
2

我认为之所以如此,是因为工会将不止一个元素重新结合在一起。以下是围绕语法的工作:

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

int main () {
  B obj;
  std::cout << "obj.u.i = " << obj.u.i << "\n";
}
于 2013-07-22T14:39:54.793 回答