ISO C++委員会は、2020年2月までに公開予定の、C++20と呼ばれる次期C++標準の機能リストをクローズした。C++20はC++の重要な改訂版で、モジュール、コルーチン、コンセプトを主要な新機能として提供する。
先日ケルンで行われた会議において、ISO C++委員会は、フィードバック収集のためにすべての国家標準機関に提出するC++20ドラフトの、最後となる変更に合意した。最後に追加されたのは、std::format
、C++20同期ライブラリ、改良されたスレッドなどである。これらとは対照的に、コントラクトはドラフトから除外され、C++23/C++26まで延期された。
C++20では、新たなテキストフォーマットAPIとしてstd::format
が導入される。1}std::formatは、printf
関数ファミリと同じような柔軟性を、メッセージと引数を分離したより自然な呼び出し形式で実現すると同時に、iostreams
と同等の安全性と拡張性を備えることを目標に、次のような記述を可能にする。
string message = format("The answer is {}.", 42);
C++20では、効率的なatomic
待機とセマフォ、ラッチ、バリア、ロックフリー整数型などのサポートを含む、同期とスレッドコーディネーションの改善も行われる。
これまでの会議において、標準委員会は、モジュールやコルーチン、コンセプトといった、言語の使用方法の根本的な転換を期待させる、いくつかの重要な機能の導入に同意していた。
モジュールサポートは名前空間に直交するもので、ヘッダファイルとソースファイルの分離を不要にして、大規模なコードベースを論理的部分に構造化することを可能にする。この方法では、関数をエクスポートする単純なモジュールを定義して、別のファイルからそれを利用することができる。
// math.cppm
export module mod1;
export int identity(int arg) {
return arg;
}
// main.cpp
import mod1;
int main() {
identity(100);
}
コルーチンは、停止と再開の可能な関数である。コルーチンはスタックレスである。すなわち、停止すると呼び出し元に戻る。コルーチンでは、新たに3つのオペレータがサポートされる。"co_await
"は、呼び出し元に値を返さずに実行を一時停止する。 "co_yield
"は、中断して値を返す。"co_return
"は、実行を終了して値を返す。これらの3つのオペレータによって、非同期タスク、ジェネレータ、遅延関数の作成が可能になる。以下はジェネレータの例だ。
generator<int> iota(int n = 0) {
while(true)
co_yield n++;
}
もうひとつの重要な新機能であるコンセプトは、等式推論(equational reasoning)の基盤になるものだ。コンセプトを使うことで、テンプレート引数のコンパイル時検証を実行し、型のプロパティに基づいて関数ディスパットを行うことが可能になる。
コントラクト以外にも、リフレクションメタクラス、エグゼキュータ、プロパティといった重要な言語機能が、C++20には含まれず、C++23/C++26に延期されている。
当然ながらC++20には、この短い記事では伝えられないものが多数ある。詳細についてはフルトリップレポートを参照して頂きたい。