您是否总是必须为包含具有用户定义默认构造函数的成员的联合声明默认构造函数和析构函数?

Do you always have to declare a default constructor and destructor for unions containing members with user-defined default constructor?

这个 class 包含联合:

struct foo
{
    union
    {
        std::vector<int> vec;
        int i;
    };
};

无法实例化。如果我尝试,编译器会抛出一条错误消息 'foo::foo(void)': attempting to reference a deleted function。为了让它工作,我必须像这样向联合添加一个空的构造函数和析构函数:

struct foo
{
    union U
    {
        U() {}
        ~U() {}
        std::vector<int> vec;
        int i;
    } u_;
};

这样就可以实例化成功了。总是这样吗?为什么?为每个包含具有用户定义的默认构造函数的成员的联合编写一个空的构造函数和析构函数似乎很愚蠢。

It seems silly to write an empty constructor and destructor for ...

不仅傻,而且还错了

Why [does the compiler doesn't generate one and you need to]?

工会不知道它的哪个成员是活跃的。因此,如果它的至少一个成员具有 non-trivial 特殊方法,则联合无法生成该特殊方法,因为它不知道在哪个成员上调用该特殊方法。

现在我们来处理您的情况。您确实需要编写一个特殊的方法,但将其留空也无济于事。您需要编写一个特殊的方法来正确地委托给活动成员。例如在 foo 中你可以有一个数据成员(枚举或索引)告诉你哪个联合成员是活跃的。在您的联合特殊方法中,您检查该索引并在联合的活跃成员上调用特殊方法。

或者你可以忘记这一切,只使用标准库中的类型,它不仅为你设置了一切,而且类型安全:std::variant.