union不能包含具有虚函数的对象

Ale*_*Dan 6 c++ unions

码:

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对联合成员的要求不同.