class Foo {
Foo(int val) { /* Do some initialization */ }
Foo() { /* Do nothing */ }
};
union Bar {
Foo foo;
};
该代码会生成此错误:
错误C2620:union'Bar'的成员'Bar :: foo'具有用户定义的构造函数或非平凡的默认构造函数
我明白为什么如果构造函数实际执行某些操作会抛出该错误,但构造函数不带参数而什么都不做。有什么办法可以把这个班级变成一个联盟吗?我不得不一直采取行动char foo[sizeof(Foo)]
,并希望有一个更清洁的解决方案。
答案 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内。