最小代码示例:
struct B {
union U {
struct S {} s;
int i = 100;
}
u;
};
现在,如果我们声明一个B obj;
,那么obj.u.i
将被分配一个垃圾值,而不是100
。请在此处查看演示。(垃圾值因优化标志等而异)。
"类内初始化"功能应该与并集一起使用吗。
- 如果是,那么正确的语法是什么?或者这是一个g++错误
- 如果没有,那么
int i = 100;
做什么
这看起来像是一个GCC错误。标准规定(9.5p2):
并集中最多有一个非静态数据成员可以具有大括号或相等的初始值设定项。
否则,规则与普通类的规则相同。
编辑:此外,12.6.2p8:
在非委托构造函数中,如果给定的非静态数据成员或基类不是由mem初始值设定项id指定的(包括没有的情况mem初始化器列表,因为构造函数没有ctor初始化器),并且实体不是抽象类的虚拟基类(10.4),则
- 如果实体是具有大括号或相等初始值设定项的非静态数据成员,则实体将按照8.5中的规定进行初始化
- 否则,如果实体是变体成员(9.5),则不执行初始化
- 否则,实体将默认初始化(8.5)
这里假定隐式定义的默认构造函数计数。i
成员满足第一个要点中的条件,因此它被初始化为常规类成员。s
成员与第二个项目符号点匹配,因此未初始化。
我认为这是因为一个并集将多个元素重新组合在一起。以下是语法方面的工作:
struct B {
union U {
int i;
}
u {100};
};
int main () {
B obj;
std::cout << "obj.u.i = " << obj.u.i << "n";
}