编译时错误:联合默认构造函数已删除

时间:2019-02-03 15:18:35

标签: c++ c++11 constructor compiler-errors unions

以下C ++代码无法编译。就我研究此问​​题而言,我知道该问题是因为联合的默认构造函数已被编译器删除。联机注释显示以下内容:

  

如果联合包含具有非平凡默认构造函数的非静态数据成员,则默认情况下会删除联合的默认构造函数,除非联合的变体成员具有默认成员初始化程序。

struct A {
   int val;
   A() : val(0) {}
};

union B
{
   A a;
};

B b;

为什么struct A的默认构造函数被认为是不平凡的?如何解决此问题以使此代码成功编译?

1 个答案:

答案 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 = {};
};