【问题标题】:Compile Time Error: Union default constructor is deleted编译时错误:Union 默认构造函数被删除
【发布时间】:2019-02-03 15:18:34
【问题描述】:

以下 C++ 代码无法编译。据我研究过这个问题,我知道问题是因为联合的默认构造函数已被编译器删除。在线说明如下:

如果联合包含具有非平凡默认构造函数的非静态数据成员,则默认删除联合的默认构造函数,除非联合的变体成员具有默认成员初始值设定项。

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

union B
{
   A a;
};

B b;

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

【问题讨论】:

  • 我在发布这个问题之前看过这篇文章。但是,很抱歉,我无法真正理解如何解决此问题。
  • @Spinkoo 也许有细微差别。这个问题问“有什么问题”。那个人问“为什么存在这条规则”
  • 是的,我也想知道解决上述问题的最简单方法(如果有的话)是什么。
  • 我不确定这个修复是否是最简单和最正确的,但尝试像这样在联合内部声明 A a();而不是 A a

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


【解决方案1】:

为什么结构 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 = {};
};

【讨论】:

  • @DavisHerring 我不确定你指的是什么。这是我附加到答案的内容吗?
  • 就是这样(或者只是A a{};)——但它是默认初始化的,而不是零初始化的,即使val 确实变成了0。重要的是它使B 有一个默认构造函数。
猜你喜欢
  • 2022-01-22
  • 2023-03-20
  • 2022-01-15
  • 2016-09-11
  • 2019-01-04
  • 1970-01-01
  • 2019-07-31
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多