6

代码:

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)、非平凡复制构造函数 (12.8)、非平凡析构函数 (12.4) 或非平凡复制赋值运算符 (13.5.3, 12.8) 的类的对象不能是联合的成员,也不能是此类对象的数组。如果联合包含静态数据成员或引用类型的成员,则程序格式错误。

该标准没有说明具有虚函数的类的对象,并且从错误中,编译器抱怨我没有使用的构造函数和复制赋值运算符。那么这是一个编译器错误吗?我正在使用 gcc 。

4

2 回答 2

11

该结构的隐式声明的默认构造函数、复制构造函数和复制赋值运算符是重要的,因为它有一个virtual函数,所以你已经打破了这些要求。

如果构造函数是隐式声明的默认构造函数并且满足以下条件,则构造函数是微不足道的:

  • 它的类没有虚函数 (10.3) 和虚基类 (10.1),并且
  • [...]

如果隐式声明类的复制构造函数X并且如果

  • X没有虚函数 (10.3) 和虚基类 (10.1),并且
  • [...]

如果隐式声明类的复制赋值运算符X并且如果

  • X没有虚函数 (10.3) 和虚基类 (10.1),并且
  • [...]

C++11 的引用类似(它只包括移动构造函数和赋值运算符),但 C++11 对联合成员没有相同的要求。

于 2013-02-19T17:10:32.453 回答
0

如果可以,请使用 C++11,它不包含此类约束

于 2013-02-19T17:16:28.017 回答