码:
struct A{
int a;
virtual void f(){}
};
union B{
A ob;
};
Run Code Online (Sandbox Code Playgroud)
编译时错误:
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 ===|
Run Code Online (Sandbox Code Playgroud)
c ++ 03标准:
具有非平凡构造函数(12.1),非平凡复制构造函数(12.8),非平凡析构函数(12.4)或非平凡复制赋值运算符(13.5.3,12.8)的类的对象不能是一个联盟的成员,也不是一系列这样的对象.如果联合包含静态数据成员或引用类型的成员,则该程序格式错误.
该标准没有说明具有虚函数的类的对象,并且从错误中,编译器抱怨我没有使用的构造函数和复制赋值运算符.这是编译器错误吗?我正在使用gcc.
Jos*_*eld 11
隐含声明的默认构造函数,复制构造函数和该结构的复制赋值运算符非常简单,因为它有一个virtual函数,因此您已经破坏了这些要求.
构造函数是微不足道的,如果它是一个隐式声明的默认构造函数,如果:
- 它的类没有虚函数(10.3),也没有虚基类(10.1),和
- [...]
如果隐式声明了类的复制构造函数,那么它的复制构造函数
X是微不足道的
- class
X没有虚函数(10.3),没有虚基类(10.1),和- [...]
A类拷贝赋值运算符
X是微不足道的,如果它是隐式声明,如果
- class
X没有虚函数(10.3),没有虚基类(10.1),和- [...]
C++ 11引用类似(它只包括移动构造函数和赋值运算符)但C++ 11对联合成员的要求不同.