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 に答える