4
class Foo {
    Foo(int val) { /* Do some initialization */ }
    Foo() { /* Do nothing */ }
};
union Bar {
    Foo foo;
};

该代码生成此错误:

错误 C2620:联合 'Bar' 的成员 'Bar::foo' 具有用户定义的构造函数或非平凡的默认构造函数

我理解如果构造函数确实做了一些事情,为什么你会抛出那个错误,但是这里的构造函数不带参数也不做任何事情。有什么办法可以把这个类塞进一个工会?我不得不求助于所有的方法,char foo[sizeof(Foo)]并且想要一个更清洁的解决方案。

4

4 回答 4

6

最初来自这个问题:

使用非平凡的构造函数初始化联合

来自 C++03,9.5 联合,第 162 页

联合可以具有成员函数(包括构造函数和析构函数),但不能具有虚拟 (10.3) 函数。联合不应有基类。联合不应用作基类。具有非平凡构造函数 (12.1)、非平凡复制构造函数 (12.8)、非平凡析构函数 (12.4) 或非平凡的类的对象复制赋值运算符(13.5.3、12.8)不能是联合的成员,也不能是此类对象的数组

所以,你的班级被禁止成为工会的成员。

于 2010-09-27T12:29:20.217 回答
3

这在 C++03 标准中是不允许的。

如果联合中允许具有用户定义的默认构造函数的对象,编译器将无法决定使用哪个构造函数,因为它们都引用相同的内存位置。因此,联合中不允许使用用户定义的构造函数的对象。

编译器将忽略您的构造函数不做任何事情的事实,因为它可能在联合之外的其他地方定义。

你可能会逃脱 C++0x constructor() = default;

于 2010-09-27T12:33:48.473 回答
1

标准专家可能会比我更准确地回答这个问题,但如果我没记错的话,工会成员必须是 POD 类型的。

如果boost::variant要在联合中使用非 POD 类,请使用。

于 2010-09-27T12:27:34.780 回答
0

如果您的类具有用户定义的构造函数、析构函数或复制构造函数或赋值运算符,则它不能位于联合内部。

于 2010-09-27T12:30:45.033 回答