元々昨年2月のリリースが計画されていた、C++20は最終的な技術的承認を受けており、年内に発表される予定だ。C++20には、主要な新機能の中にModules、Coroutines、およびConceptsが含まれる。
Modulesは、ヘッダファイルを不要にすることも目的とするコードをカプセル化する新しい方法を導入する。Herb Sutter氏は、Modulesの重要性を軽視することはできないと述べた:
C++にユーザが名前付きカプセル化境界を定義できる新機能を追加したのは、約35年ぶりです。
変数、関数、クラスに加えて、Modulesは、プログラマがエンティティに名前を付けて、なんらかの実装を隠す方法を提供する。これまでは、変数を使用して値をカプセル化し、関数を使用して動作をカプセル化し、クラスを使用して状態と動作をカプセル化することができた。Modulesは、変数、関数、クラスをすべて一緒にカプセル化するメカニズムを提供する。
これが、Modulesが将来のC++の進化に続けてさらなる改善を可能にする根本的な理由です。
これは、関数とその使用法を別のファイルにエクスポートする単純なModulesを定義する方法である:
// math.cppm
export module mod1;
export int identity(int arg) {
return arg;
}
// main.cpp
import mod1;
int main() {
identity(100);
}
Coroutinesはスタックレス関数であり、停止および再開できる。Coroutinesは、非同期タスク、ジェネレーター、レイジー関数の作成に使用できる3つの演算子をサポートしている。co_await
は、呼び出し元に値を返さずに実行を一時停止する。co_yield
は、値を返す間、一時停止する。co_return
は、実行を終了して値を返す。以下はジェネレーターの例である:
generator<int> iota(int n = 0) {
while(true)
co_yield n++;
}
Conceptsは、テンプレートパラメータのコンパイル時の述語の定義を可能にするテンプレートの拡張である。Conceptsは、構文上の制限ではなく意味カテゴリをモデル化することを目的としている。標準ライブラリには、Integral
、Assignable
、StrictTotallyOrdered
、MoveConstructible
、Callable
などの多くの事前定義されたConceptsがすでに含まれている。たとえば、Integral
のConceptsは次のように定義されている:
template <class T>
concept bool Integral() {
return std::is_integral<T>::value;
}
Conceptsを定義したら、次のようなテンプレート定義で使用できる:
template<Integral T> // shorthand for: template<typename T> requires Integral<T>()
T foo(T a, T b) {
...
}
Integral foo(Integral&); // even shorter
C++20には、構造化バインディング拡張と参照キャプチャ、()を使用した集約の初期化、polymorphic_allocatorなど、多数の小さな変更も含まれている。
C++20が現在のC++標準になるための最終的な道筋を作っている間、ISO委員会はすでにモジュラ標準ライブラリ、エグゼキュータ、リフレクション、パターンマッチング、コントラクトを機能できるC++23の作業を開始している。現在のパンデミックと対面会議への制限により、実行できる作業量が減少する可能性がある。