C++20

C++20とは



C++20は、プログラミング言語C++の最新の標準規格であり、ISO/IEC 14882:2020として定められています。これは、C++17の後継バージョンであり、2020年9月に正式に承認され、同年12月に公開されました。C++20では、多くの新しい機能が導入され、既存の機能も改善されています。これにより、C++はより強力で使いやすい言語へと進化しました。

C++20の主な新機能



C++20では、以下のような主要な新機能が導入されました。

言語機能



コンセプト: テンプレートの制約をより簡潔に記述するための機能。これにより、コンパイル時のエラーメッセージが分かりやすくなり、テンプレートの利用が容易になります。
モジュール: コードの分割とカプセル化を改善する機能。ヘッダーファイルの依存関係を解消し、コンパイル時間の短縮に貢献します。
指示付き初期化子: C99の機能に基づき、構造体の初期化をより柔軟に行えるようにする機能。
ラムダの拡張: ラムダ式がより強力になり、キャプチャ機能やテンプレートパラメータリストが拡張されました。
三方比較演算子(`<=>`): 三方向の比較結果を簡潔に記述できる演算子。
範囲ベースfor文の拡張: ループ内で追加の変数を初期化できるようになりました。
未評価コンテキストでのラムダ: 未評価のコンテキストでラムダ式を使用できます。
デフォルトの構築可能で割り当て可能なステートレスラムダ: デフォルトで構築と割り当てが可能なステートレスラムダが利用可能です。
ラムダinit-captureでのパック拡張: ラムダのinit-captureでパック拡張を使用できます。
テンプレートパラメータとしての文字列リテラル: テンプレートパラメータとして文字列リテラルが使用できるようになりました。
`typename`の省略: 特定の状況で`typename`キーワードを省略できます。
新しい標準属性: `no_unique_address`, `likely`, `unlikely`などの新しい属性が追加されました。
条件付き`explicit`: `explicit`修飾子がブール式に依存できるようになりました。
`constexpr`の拡張: `constexpr`関数が仮想関数、共用体、`try`と`catch`、`dynamic_cast`、`typeid`、`std::pointer_traits`で使用できるようになりました。
`consteval`キーワード: コンパイル時に評価される即時関数を定義するためのキーワード。
符号付き整数の2の補数表現の定義: 符号付き整数が2の補数で表現されることが明確に定義されました(ただし、オーバーフローは未定義のまま)。
改訂されたメモリモデル: メモリモデルが改訂されました。
構造化バインディングの改善: ラムダキャプチャ、静的ストレージ期間、thread_localストレージ期間における構造化バインディングの挙動が改善されました。
コルーチン: 非同期処理を記述するためのコルーチン機能が導入されました。
スコープ付き列挙型での`using`: スコープ付き列挙型で`using`宣言が使用できます。
`constinit`キーワード: コンパイル時定数を初期化するためのキーワード。

ライブラリ機能



範囲(Ranges): イテレータのペアの抽象化であり、アルゴリズムを簡潔に記述できる機能。
`std::make_shared`と`std::allocate_shared`の拡張: 配列で利用できるようになりました。
アトミックスマートポインター: `std::atomic>`や`std::atomic>`のようなアトミックスマートポインターが利用可能です。
`std::to_address`: 生ポインターを取得するための関数。
`std::chrono`の拡張: カレンダーとタイムゾーンのサポートが追加されました。
`std::span`: 連続した配列へのビューを提供する機能。
``ヘッダー: バージョン情報を取得するためのヘッダー。
`std::bit_cast`: オブジェクト表現の型キャストを行うための機能。
機能テストマクロ: C++20の機能を検出するためのマクロ。
`constexpr`ライブラリビット: さまざまな`constexpr`ライブラリが追加されました。
デフォルト初期化によるスマートポインターの作成: スマートポインターがデフォルト初期化で作成可能になりました。
`std::map::contains`: `std::map`に特定のキーが含まれているかを確認するメソッド。

非推奨となった機能



添え字式でのカンマ演算子の使用: 添え字式でのカンマ演算子の使用が非推奨となりました。
`volatile`: (ほとんどの)`volatile`キーワードが非推奨となりました。

新しいキーワードと属性



C++20では、`concept`, `constinit`, `consteval`, `co_await`, `co_return`, `co_yield`, `requires`, `char8_t`などの新しいキーワードが導入され、`explicit`キーワードの機能が拡張されました。また、`import`や`module`などの特別な意味を持つ識別子も追加されました。属性としては、`likely`, `unlikely`, `no_unique_address`が新たに追加されました。

C++20への変更の歴史



C++20は、多くの会議での議論と修正を経て、現在の形になりました。以下は、主な変更の歴史です。

2017年7月(トロント): コンセプト、指示付き初期化子、ラムダの拡張、`std::make_shared`と`std::allocate_shared`の拡張が適用されました。
2017年11月(アルバカーキ): 三方比較演算子、範囲ベースfor文の拡張、未評価コンテキストでのラムダ、ステートレスラムダ、ラムダinit-captureでのパック拡張、テンプレートパラメータとしての文字列リテラル、アトミックスマートポインター、`std::to_address`が適用されました。
2018年3月(ジャクソンビル): `typename`の省略、新しい標準属性、`std::chrono`の拡張、`std::span`、``ヘッダーが適用されました。
2018年6月(Rapperswil): 契約の延期、機能テストマクロ、`std::bit_cast`、条件付き`explicit`、`constexpr`仮想関数が適用されました。
2018年11月(サンディエゴ): 範囲、コンセプトの簡潔な構文、`constexpr`の拡張、`consteval`キーワード、符号付き整数の定義、メモリモデルの改訂、デフォルト初期化によるスマートポインターの作成が適用されました。
2019年2月(コナ): コルーチン、モジュール、構造化バインディングの改善が適用されました。
2019年7月(ケルン): 契約の削除、添え字式でのカンマ演算子の非推奨化、`constexpr`の拡張、スコープ付き列挙型での`using`、宇宙船演算子の変更、`constinit`キーワード、コンセプトの変更、`volatile`の非推奨化、標準ライブラリのコンセプトの名前変更、テキストフォーマットの修正、ビット操作、`constexpr INVOKE`、数学定数、アトミックの拡張、`<=>`演算子の標準ライブラリへの追加、標準ライブラリのヘッダーユニット、同期機能、`std::source_location`、`constexpr`コンテナ、`std::stop_token`とjoinされるスレッドが適用されました。
2019年11月(ベルファスト): 非タイプテンプレートパラメータ(NTTP)のクラスタイプ、浮動小数点型、ポインターと参照、共用体とunionライクなクラスがNTTPとして許可されるようになり、関数IDに末尾のrequire句も含まれるようになり、制約された非テンプレート関数が削除され、``がフリースタンディング実装で利用可能になり、`std::span`のtypedefが変更され、コンセプトの名前が変更され、範囲に対する修正と追加、`std::atomic`の初期化の変更、`std::weak_equality`と`std::strong_equality`の削除、``内のアルゴリズムが`constexpr`になり、C++20の新機能または変更された機能の不足している機能テストマクロが追加されました。

技術仕様として公開されている機能



並列処理TS v2
ネットワーキングTS v1
リフレクションTS v1

今後の標準に延期された機能



契約
リフレクション
メタクラス
Executors
ネットワーク拡張
プロパティ
* 拡張されたFuture

まとめ



C++20は、C++の進化における重要なステップであり、多くの新機能と改善が導入されました。これらの機能は、開発者の生産性を向上させ、より安全で効率的なコードを作成するのに役立ちます。C++20を学ぶことで、C++プログラミングの可能性をさらに広げることができるでしょう。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。