最小代码示例:
struct B {
union U {
struct S {} s;
int i = 100;
}
u;
};
现在,如果我们声明 aB obj;
那么将obj.u.i
分配一个垃圾值而不是100
. 在此处查看演示。(垃圾值因优化标志等而异)。
“类内初始化”功能是否应该与联合一起使用。
- 如果是,那么正确的语法是什么?或者这是一个 g++ 错误?
- 如果没有,那该怎么
int i = 100;
办?
最小代码示例:
struct B {
union U {
struct S {} s;
int i = 100;
}
u;
};
现在,如果我们声明 aB obj;
那么将obj.u.i
分配一个垃圾值而不是100
. 在此处查看演示。(垃圾值因优化标志等而异)。
“类内初始化”功能是否应该与联合一起使用。
int i = 100;
办?这看起来像一个 GCC 错误。该标准说(9.5p2):
最多一个联合的非静态数据成员可以有一个大括号或相等初始化器。
否则,规则与普通课程相同。
编辑:此外,12.6.2p8:
在非委托构造函数中,如果给定的非静态数据成员或基类不是由mem-initializer-id指定的(包括由于构造函数没有ctor-initializer而没有 mem-initializer-list的情况)并且实体不是抽象类(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";
}