- C++20に続く次世代C++標準
- C++98、C++11、C++20のようなゲームチェンジャーではなく、C++17レベルの小さな変化
(40年間の)C++標準の変化を見てみる
C++98
- 80年代末にBjarne StroustrupとMargaret A. Ellisが有名なAnnotated C++ Reference Manual(ARM)を著述
- この本の目的は2つ
- あまりにも多くのC++独立実装が存在していたため、ARMはC++の機能を定義
- C++標準であるC++98(ISO/IEC 14882)の基礎となる
- C++98はいくつかの重要な機能を含む
- Templates
- STL(Standard Template Library): コンテナ、アルゴリズム、文字列、IO Streamを含む
C++03
- C++03(14882:2003)ではごく小さな技術的修正が行われた
- コミュニティではC++98を含むC++03を「レガシーC++」と呼ぶ
TR1
- 2005年に興味深い出来事があった。TR1(Technical Report 1)が公開された
- TR1はC++11に向けた大きな一歩であり、Modern C++への第一歩
- C++標準委員会メンバーのBoostプロジェクトに基づく
- 次世代C++標準に入る13個のライブラリを含む(正規表現、乱数、
std::shard_ptrのようなスマートポインタ、ハッシュテーブルなど)
C++11
- 次のC++標準だったが、私たちはこれをModern C++と呼ぶ。この名称にはC++14とC++17も含まれる
- C++11はC++を開発する方法を完全に変えてしまった
- TR1のコンポーネントだけでなく、move semantics、perfect forwarding、variadic templates、constexprなどを導入
- スレッドベースのメモリモデルとThreading APIを含む
C++14
- 小さなC++標準。read-writer locks、一般化されたlambdasとconstexpr関数を導入
C++17
- 大きくも小さくもない
- 2つの優れた機能を含む: Parallel STLと標準化されたファイルシステム
- 約80個のSTLアルゴリズムが実行ポリシーを通じて実行可能(並列、逐次、ベクトル化)
- Boostから大きな影響を受けている。ファイルシステムと3つのデータ型(std::optional、std::variant、std::any)
C++20
- C++20はC++11と同様に、私たちのC++プログラミングのやり方を変えてしまった
- 特に大きな4つ
- Ranges: Rangesライブラリを使うと、コンテナ上で直接アルゴリズムを表現し、パイプ記号でアルゴリズムを組み合わせて無限データストリームに適用できる
- Coroutines: C++で非同期プログラミングを主流にしてくれる。協調作業、イベントループ、無限データストリームおよびパイプラインの基盤となる
- Concepts: テンプレートを考え、プログラミングする方法を変える。テンプレート引数に制約を課したり型検査などを行えるようにし、コンパイル時に確認可能
- Modules: ヘッダーファイルの限界を超えさせてくれる。さまざまなことを約束する。例えばプリプロセッサが不要になり、最終的にはビルド時間が短縮され、パッケージをより簡単にビルドできるようになる
C++23
- 2023年7月時点でC++23は最終投票を控えている
- 小さいが言語自体に非常に影響力のある機能「Deducing this」を追加
- Pythonと同様に、メンバ関数に暗黙的に渡されるthisポインタを明示的にできる
- これにより、複雑なテクニックであるCRTP(Curiously Recurring Template Pattern)やOverloadパターンの実装が簡単になる
- C++23ライブラリにも重要な追加がある
import std;で標準ライブラリを直接インポートしたり、std:printおよびstd:printlnでC++20フォーマット文字列を適用可能
- 性能面で
std::mapを置き換えるstd::flat_map
std::optionalインターフェースがComposabilityのためにMonadicインターフェースへ拡張
- 新しいデータ型
std::expected
- 多次元spanである
std::mdspan
- 数値のストリームを生成するためのコルーチン
std::generator
2件のコメント
まだネットワーキング標準の話はないようですね
次の標準も;; 不確実なのではないかと思います