以下C ++代码无法编译。就我研究此问题而言,我知道该问题是因为联合的默认构造函数已被编译器删除。联机注释显示以下内容:
如果联合包含具有非平凡默认构造函数的非静态数据成员,则默认情况下会删除联合的默认构造函数,除非联合的变体成员具有默认成员初始化程序。
struct A {
int val;
A() : val(0) {}
};
union B
{
A a;
};
B b;
为什么struct A的默认构造函数被认为是不平凡的?如何解决此问题以使此代码成功编译?
答案 0 :(得分:0)
为什么struct A的默认构造函数被认为是不平凡的?
因为它是用户声明的。
具有简单构造函数的类示例:
struct Trivial {
int val;
};
struct Trivial2 {
int val;
Trivial2() = default;
};
作为奖励,这是不平凡的:
struct NonTrivial {
int val;
NonTrivial();
};
NonTrivial::NonTrivial = default;
但是,如果您希望A::val
初始化为零,则需要向联合添加默认成员初始化器:
union B {
A a = {};
};