このページはC++20に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++17までは以下の仕様があったため、抽象クラスに早期の制限があった:
抽象クラスは、パラメータ型、関数の戻り値型、明示的型変換の型として使用してはならない。抽象クラスへのポインタや参照は宣言できる。
しかし、先行宣言したクラスは、あとで定義が追加されるために、パラメータ型、関数の戻り値型、明示的型変換の型として使用できる。
struct S;
S f(); // OK: 抽象性はここではチェックされない
struct S { virtual void f() = 0; };
S f(); // エラー!抽象クラスは関数の戻り値型として使用できない
C++20ではこれを適格とし、先行宣言と同様にクラスの完全性のチェックは、定義と呼び出しまで先送りすることとする。