编译时错误:联盟默认的构造函数将被删除

问题描述 投票:0回答:1

以下C ++代码编译失败。至于我已经看过了这个问题,据我所知,这个问题是因为工会的默认构造函数已经被编译器中删除。在线笔记说以下内容:

如果工会包含一个不平凡的默认构造函数的非静态数据成员,工会的默认构造函数在默认情况下删除,除非工会的变体成员都有一个默认的成员初始化。

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

union B
{
   A a;
};

B b;

为什么一个结构的默认构造函数认为是不平凡?如何解决这个问题,使这个代码编译成功?

c++ c++11 constructor compiler-errors unions
1个回答
0
投票

为什么一个结构的默认构造函数认为是不平凡?

因为它是用户声明。

该做的类实例有一个简单的构造函数:

struct Trivial {
    int val;
};

struct Trivial2 {
    int val;
    Trivial2() = default;
};

作为奖励,这是不平凡的:

struct NonTrivial {
    int val;
    NonTrivial();
};
NonTrivial::NonTrivial = default;

如果你想A::val要然而零初始化,你要默认成员初始化器添加到工会:

union B {
   A a = {};
};
© www.soinside.com 2019 - 2024. All rights reserved.