クラス宣言はクラスを不完全型にするため、クラスのオブジェクトを定義できませんでした。また、不完全型の定義は、そのメンバーが指定されていないことです。定義にメンバーが指定されていない本体が空のクラスは、不完全型になるということではないでしょうか。
class Empty { };
Empty e1; // okay, but why?
クラス宣言はクラスを不完全型にするため、クラスのオブジェクトを定義できませんでした。また、不完全型の定義は、そのメンバーが指定されていないことです。定義にメンバーが指定されていない本体が空のクラスは、不完全型になるということではないでしょうか。
class Empty { };
Empty e1; // okay, but why?
本体が空のクラスは不完全型ですか?
いいえ、空のボディを持つクラスは単なる空のクラスですが、それでも完全に定義されたクラスです。不完全な型は、完全な定義が表示されない型です。
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) (または完全な型) と見なさ
}
れます。[...]
はい、コンプリートタイプです。最後に確認したとき、サイズは 1 バイトです (少なくとも MS のコンパイラでは)。
不完全な構造体を作成するには、中かっこを省略します。
struct Empty;
これは前方宣言構造とも呼ばれ、構造体の定義ではありません。