代码:
struct A{
int a;
virtual void f(){}
};
union B{
A ob;
};
编译时错误:
C:\to\main.cpp|9|error: member 'A B::ob' with constructor not allowed in union|
C:\to\main.cpp|9|error: member 'A B::ob' with copy assignment operator not allowed in union|
||=== Build finished: 2 errors, 0 warnings ===|
c ++ 03标准:
具有非平凡构造函数(12.1)的类的对象,a 非平凡的复制构造函数(12.8),一个非平凡的析构函数(12.4), 或者一个非平凡的复制赋值运算符(13.5.3,12.8)不能是a 一个联合的成员,也不能有一系列这样的对象。如果一个工会 包含静态数据成员或引用类型的成员 节目形成不良。
标准没有说明具有虚函数的类的对象,并且从错误中,编译器抱怨我没有使用的构造函数和复制赋值运算符。这是编译器错误吗?我正在使用gcc。
答案 0 :(得分:11)
该结构的隐式声明的默认构造函数,复制构造函数和复制赋值运算符非常简单,因为它具有virtual
函数,因此您已经破坏了这些要求。
如果构造函数是隐式声明的默认构造函数,则构造函数是 trivial ,如果:
- 其类没有虚函数(10.3),没有虚基类(10.1)和
- [...]
如果隐式声明了类
X
的复制构造函数琐事,那么
- class
X
没有虚函数(10.3),没有虚基类(10.1),- [...]
如果隐式声明了类
X
的副本赋值运算符琐事,那么
- class
X
没有虚函数(10.3),没有虚基类(10.1),- [...]
C ++ 11引用类似(它只包含移动构造函数和赋值运算符)但C ++ 11对联合成员的要求不同。
答案 1 :(得分:0)
如果可以,请使用C ++ 11,它不包含此类约束