将具有用户定义的构造函数的类填充到并集中

时间:2010-09-27 12:22:46

标签: c++ constructor unions

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

该代码会生成此错误:

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

我明白为什么如果构造函数实际执行某些操作会抛出该错误,但构造函数不带参数而什么都不做。有什么办法可以把这个班级变成一个联盟吗?我不得不一直采取行动char foo[sizeof(Foo)],并希望有一个更清洁的解决方案。

4 个答案:

答案 0 :(得分:6)

最初来自这个问题:

Initializing a union with a non-trivial constructor

来自C ++ 03,9.5 Unions,第162页

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

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

答案 1 :(得分:3)

C ++ 03标准中不允许这样做。

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

编译器将忽略构造函数不执行任何操作的事实,因为它可能在union之外的其他位置定义。

您可能会使用C ++ 0x constructor() = default;

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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