2

クラス宣言はクラスを不完全型にするため、クラスのオブジェクトを定義できませんでした。また、不完全型の定義は、そのメンバーが指定されていないことです。定義にメンバーが指定されていない本体が空のクラスは、不完全型になるということではないでしょうか。

class Empty { };

Empty e1; // okay, but why?
4

3 に答える 3

4

本体が空のクラスは不完全型ですか?

いいえ、空のボディを持つクラスは単なる空のクラスですが、それでも完全に定義されたクラスです。不完全な型は、完全な定義が表示されない型です。

class Empty;

// Here, Empty is an incomplete type

class Empty { };

// Here, Empty is a complete type

C++11 標準のパラグラフ 3.9/5 によると:

宣言されているが定義されていないクラス、または不明なサイズの配列または不完全な要素型の配列は、不完全に定義されたオブジェクト型です。不完全に定義されたオブジェクト型と void 型は不完全な型です (3.9.1)。オブジェクトは、不完全な型を持つように定義されてはなりません。

また、パラグラフ 9.2/2:

クラスは、クラス指定子の終了時に、完全に定義されたオブジェクト型 (3.9) (または完全な型) と見なさ}れます。[...]

于 2013-05-15T19:15:08.873 に答える
0

はい、コンプリートタイプです。最後に確認したとき、サイズは 1 バイトです (少なくとも MS のコンパイラでは)。

不完全な構造体を作成するには、中かっこを省略します。

struct Empty;

これは前方宣言構造とも呼ばれ、構造体の定義ではありません。

于 2013-05-15T19:15:53.417 に答える