不完全な型はインスタンス化できず、抽象クラス (つまり、純粋仮想メンバー関数を持つクラス) もインスタンス化できません。
struct incomplete_type;
struct abstract_class
{
virtual void foo() = 0;
};
ひょっとして、抽象クラス自体が不完全型と見なされるのでしょうか?
不完全な型はインスタンス化できず、抽象クラス (つまり、純粋仮想メンバー関数を持つクラス) もインスタンス化できません。
struct incomplete_type;
struct abstract_class
{
virtual void foo() = 0;
};
ひょっとして、抽象クラス自体が不完全型と見なされるのでしょうか?
表面的には似ています (抽象クラスには定義がありますが、不完全な型にはありません)。
[n3690: 3.9/5]:
[..] オブジェクトは、不完全な型を持つように定義されてはなりません。
[n3690: 10.4/2]:
抽象クラスは、他のクラスの基本クラスとしてのみ使用できるクラスです。抽象クラスのオブジェクトは、それから派生したクラスのサブオブジェクトとして作成することを除いて作成できません。 [..]
[n3690: 10.4/3]:
抽象クラスは、パラメーターの型、関数の戻り値の型、または明示的な変換の型として使用してはなりません。抽象クラスへのポインターと参照を宣言できます。
ただし、実際には、標準は 2 つの概念が無関係であることを明確にしています。
[n3690: 3.9/5]:
宣言されているが定義されていないクラス、特定のコンテキスト (7.2) での列挙型、または不明なサイズまたは不完全な要素型の配列は、不完全に定義されたオブジェクト型です。不完全に定義されたオブジェクト型と void 型は不完全な型です(3.9.1)。オブジェクトは、不完全な型を持つように定義されてはなりません。
抽象クラスには定義があるため、不完全な型と見なすことはできません。
N3690 は C++14 委員会のドラフトです。