Skip to content

Latest commit

 

History

History
323 lines (283 loc) · 54.6 KB

implementation-status.md

File metadata and controls

323 lines (283 loc) · 54.6 KB

コンパイラの実装状況

このページでは、C++のバージョンごとの言語機能を、どのコンパイラがどのバージョンからサポートしているかをまとめる。

ライブラリ機能については、本サイトのリファレンスで各機能を参照してもらいたい。

言語機能 説明 GCC Clang ICC MSVC
N2341: alignas アライメント指定 4.8 3.0 15.0 2015
2003あるいはそれ以前からある__declspec(align(x))構文で代替可能。
N2341: alignof アライメント取得 4.5 3.3 15.0 2015
2003あるいはそれ以前よりある__alignofで代替可能。
N1984: auto 型推論 4.4 2.9 12.0 2010
N2343: decltype 式の型を取得 4.3 2.9 13.0 2010 (partial)
2012
N1653: C99互換のプリプロセッサ 可変引数マクロPragma演算子__func__ 4.3 2.9 11.1 2005 (partial): 可変引数のみ _Pragmaの代わりに__pragmaが存在する。
2019 Update 6
N2235: constexpr 定数式 4.6 3.1 13.0 (partial)
14.0
2015 (partial)
2015 Update 1
N2346: 関数のdefault/delete宣言 自動定義される特殊関数の制御 4.4 3.0 12.0 2013: ムーブコンストラクタ・ムーブ代入演算子のdefaultは不可
2015
N1986: 委譲コンストラクタ コンストラクタから他のコンストラクタに処理を委譲する 4.7 3.0 14.0 2013
N2437: 明示的な型変換演算子のオーバーロード 明示的な型変換が行われる場合にのみ呼び出される演算子をオーバーロードできるようにする 4.5 3.0 14.0 2013
N1791: friend宣言できる対象を拡張 テンプレートパラメータや型の別名をfriend宣言 4.7 2.9 11.1 (partial)
12.0
2010
N1987: extern template テンプレートのインスタンス化抑止 3.3 2.9 11.1 6.0
N2540: 継承コンストラクタ 基底クラスのコンストラクタを継承する 4.8 3.3 15.0 2015
N2927: ラムダ式 関数オブジェクトをその場に書く 4.5 3.1 12.0 2010 (partial)
2012
N2657: ローカル型と無名型を、テンプレート引数として使用することを許可 ローカルおよび無名として定義したクラスや列挙型を、テンプレート引数として渡せるようにする 4.5 2.9 12.0 2010
N1811: long long 64ビット以上の大きさを持つ整数型 4.3 2.9 11.1 2003
N2535: インライン名前空間 ネストした名前空間に、透過的にアクセスする 4.4 2.9 14.0 2015
N2249: char16_tchar32_t UTF-16とUTF-32の文字型 4.4 2.9 12.1 (Windows: partial)
12.1 (GNU/Linux, macOS)
14.0
2015
2010より組み込み型ではなく型の別名として存在する
N2442: UTF-8文字列リテラル charの文字列をUTF-8エンコーディングするプレフィックス 4.5 3.0 12.1 (Windows: partial)
12.1 (GNU/Linux, macOS)
14.0
2015
N2442: 生文字列リテラル 文字列リテラルにRプレフィックスを付けることで、エスケープシーケンスを無視する 4.5 3.0 14.0 2013
N2765: ユーザー定義リテラル リテラルのサフィックスをユーザー定義する 4.7 3.1 15.0 2015
N2541: 戻り値の型を後置する関数宣言構文 以下のような形式での関数宣言
auto f(arg_types...) -> return_type
4.4 2.9 12.0 2010
N2431: nullptr ヌルポインタを表すポインタリテラル 4.6 3.0 11.1 2010
N1757: テンプレートの右山カッコ vector<basic_string<char>>のように、>>をスペースを空けずに記述可能にする 4.3 2.9 11.1 2005
N2118: 右辺値参照・ムーブセマンティクス 右辺値によるオーバーロード、およびそれによるリソースの所有権移動 4.3 (partial)
4.6
2.9 12.0 2010 (partial) ムーブコンストラクタと代入演算子の暗黙定義に対応していない。
2015
N1720: コンパイル時アサート コンパイル時に条件式が真であることを表明する 4.3 2.9 11.1 2010
N2347: enumの先行宣言 4.6 3.1 11.1 (partial)
14.0
2012
N2347: スコープを持つ列挙型 強い型付けとスコープを持つ列挙型 4.4 2.9 11.1 (partial)
14.0
2012
N2258: エイリアステンプレート テンプレートによって型の別名を定義する 4.7 3.0 12.1 2013
N2544: 共用体の制限解除 共用体のメンバ変数として、クラスオブジェクトを持つ 4.6 3.1 14.0(Linux系OSおよびMacのみ。Windowsは非対応) 2015
N2242: 可変引数テンプレート 任意の数のテンプレートパラメータを受け取れるようにする 4.3 (partial)
4.4
2.9 12.1 2013
N2930: 範囲for文 配列やコンテナといった範囲を表すオブジェクトを、簡潔に走査する 4.6 3.0 13.0 2012
N2928: overridefinal メンバ関数のオーバーライド指定、および派生クラスでのオーバーロードを禁止する指定 4.7 2.9 14.0 2005 (partial): overrideのみ。finalの代わりにsealedが存在する。ただし両者ともデストラクタには指定できない。
2012
N2761: 属性構文 [[attr]]構文による、クラス、関数、変数の属性指定 4.8 3.3 12.1 2015
N2439: メンバ関数の左辺値/右辺値修飾 オブジェクトが左辺値/右辺値の場合のみ呼び出し可能であることの指定 4.8.1 2.9 14.0 2015
N2756: 非静的メンバ変数の初期化 メンバ変数を、宣言と同時に初期値指定する 4.7 3.0 14.0 2013
N2672: 初期化子リスト 波括弧による初期化をユーザー定義する。vector<int> v = {1, 2, 3};など。 4.4 3.1 14.0 2013
N2672: 一様初期化 コンストラクタ呼び出しを波カッコで行う。 T x { a, b, c }; 4.4 3.1 13.0(partial)
14.0
2013
N3050: noexcept 関数の例外指定、例外を投げる可能性のある式かbool値を返す演算子 4.6 3.0 13.0(partial)
14.0
2015
N2634: 任意の式によるSFINAE 特定の式が有効かどうかで、その関数をオーバーロード解決に含めるかどうかを決定する 4.4 2.9 12.0 2015 Update 1 (partial)
2017 Update 7
N2659: スレッドローカルストレージ スレッドごとに異なる静的記憶域に保持される変数 4.8 3.3 11.1 (partial) 2010
__declspec(thread)属性での部分サポート
2015
N2660: ブロックスコープを持つstatic変数初期化のスレッドセーフ化 関数ローカルで定義したstatic変数の初期化を、スレッドセーフにする 4.3 2.9 11.0 (Lnux/macOS)
14.0
2015

各処理系のC++11実装状況ページ:

言語機能 説明 GCC Clang ICC MSVC
N3472: 2進数リテラル 2進数を表す0b or 0Bプレフィックスを付けた数値リテラルの記述を可能とする 4.3(GNU)
4.9
2.9 11.0 2015
N3638: 通常関数の戻り値型推論 関数の戻り値型をautoにすることで、return文から戻り値の型を推論させる 4.8(partial)
4.9
3.3(partial)
3.4
15.0 2015
N3648: ラムダ式の初期化キャプチャ キャプチャに代入構文を導入し、一つの変数に複数のキャプチャ方法を指定可能にする 4.9 3.4 15.0 2015
N3649: ジェネリックラムダ ラムダ式のパラメータをautoにすることで、ジェネリックな関数呼び出し演算子を持つ関数オブジェクトを生成する 4.9 3.4 16.0 2015
N3651: 変数テンプレート 変数定義時のテンプレート指定を可能にする。 5.1 3.4 16.0 2015 Update 2
N3652: constexprの制限緩和 if文、switch文による条件分岐の許可。
for文、while文、do-while文によるループの許可。
void戻り値型の許可
初期化を伴う変数宣言の許可。
変数書き換えの許可。
5.1 3.3(partial)
3.4
16.0 2017
N3653: 宣言時のメンバ初期化を持つ型の集成体初期化を許可 一様初期化と初期化子リストを組み合わせた際、二重に波カッコが必要となっていた仕様を緩和し、波カッコを省略できるようにする 5.1 3.3 16.0 2017
N3760: [[deprecated]]属性 非推奨の機能であることを示す属性。 4.9 3.4 15.0
(Linux/Mac OS)
2015
それ以前は__declspec(deprecated)で代替可能
N3781: 数値リテラルの桁区切り文字 シングルクォーテーションで数値リテラルを桁区切りする。 4.9 3.4 16.0 2015
N3778: サイズ付きデアロケーション サイズをとるdelete演算子のオーバーロードを許可する。 5.1 3.4 16.0 2015

各処理系のC++14実装状況ページ:

言語機能 説明 GCC Clang ICC MSVC
N3928: メッセージなしのstatic_assert デフォルトの表明メッセージを使用する 6 3.5 18.0 2017
N4086: トライグラフを削除 5.1 3.5 19.1 2010
N4051: テンプレートテンプレートパラメータにtypenameを許可 classキーワードしか使用できなかった部分に、typenameを許可 5.0 3.5 17.0 2015
N3922: 単一要素初期化子リストをautoで受け取った場合の型を変更 initializer_list<T>だったのをTに変更 5 3.8 17.0 2015
N4295: 畳み込み式 パラメータパックに対する2項演算の集積処理 6 3.6 19.0 2017 Update 5
N4267: UTF-8文字リテラル 文字列リテラルだけでなく、文字リテラルにもUTF-8指定できるようにする 6 3.6 17.0 2015
N4230: 入れ子名前空間の定義 namespace A::B {}のように、入れ子の名前空間を簡単に定義できるようにする 6 3.6 17.0 2015 Update 3
N4266: 名前空間と列挙子に属性の付加を許可 名前空間の定義と、列挙型の各要素の定義に、属性を付けられるようにする 名前空間は4.0
列挙子は6
3.6 17.0 2015
N4268: 全ての非型テンプレート引数の定数式評価を許可 ポインタの定数式評価として、配列からポインタへの変換や、関数から関数ポインタへの変換などを許可 6 3.6 19.1 2017 Update 5
P0001R1: 非推奨だったregisterキーワードを削除 7 3.8 18.0 2017 Update 3
P0002R1: 非推奨だったbool型オブジェクトに対するインクリメントの仕様を削除 7 3.8 18.0 2017 Update 3
P0012R1: 例外仕様を型システムの一部にする 7 4 18.0 2017 Update 5
P0061R1: プリプロセッサでの条件式__has_include 対象のインクルードファイルが存在するかをプリプロセス時に判定する 5.0 3.0 18.0 2017 Update 3
P0136R1: 継承コンストラクタの新仕様 デフォルト引数を引き継ぐようにした 7 3.9 No 2017 Update 7
P0188R1: [[fallthrough]]属性 case節でbreakreturnを書かなかった場合に、それが意図したフォールスルーであることをコンパイラに伝える属性 7 3.9 18.0 2017
P0189R1: [[nodiscard]]属性 関数の戻り値を無視してはならないことをユーザーに伝える属性 4.8からは[[gnu::warn_unused_result]]を使用すること
7からサポート
3.9 18.0 2017 Update 3
P0212R1: [[maybe_unused]]属性 使用しない可能性がある変数であることをコンパイラに伝える属性 4.8からは[[gnu::unused]]を使用すること
7からサポート
3.9 18.0 2017 Update 3
P0017R1: 基底クラスのメンバ変数を集成体初期化するための波カッコを省略できるようにする 基底クラスのメンバを集成体初期化するために、derived d {{42}};の代わりにderived d {42};と書けるようにする 7 3.9 19.1 2017 Update 7
P0170R1: ラムダ式をconstexprとして使用できるようにする ラムダ式の関数オブジェクトが定数式の文脈で使用された場合に、それがコンパイル時に評価されるようにする 7 5 19.0 2017 Update 3
P0184R0: 範囲for文のためのbegin()end()関数が、異なる型を返すことを許可 begin()end()が異なるイテレータ型を返せるようにすることで、終端イテレータを定義しやすくする 6 3.9 18.0 2017
P0018R3: ラムダ式での*thisのコピーキャプチャ キャプチャリストに*thisを指定することで、*thisをコピーキャプチャする 7 3.9 19.0 2017 Update 3
P0138R2: enum class変数の初期値として整数を指定する際の規則を調整 キャストを使用することなく整数を初期値として使用し、E e{0};のような初期化を許可 7 3.9 19.0 2017 Update 3
P0245R1: 浮動小数点数の16進数リテラル hexfloatマニピュレータやprintf()の16進数出力に合わせて、浮動小数点数のリテラルも16進数表記できるようにする 3.0 3.0 18.0 2017 Update 5
P0028R4: 属性の名前空間指定に繰り返しをなくす [[using CC: opt(1), debug]]のように属性の名前空間宣言をまとめて行う 7 3.9 18.0 2017 Update 3
P0035R4: アライメント指定されたデータの動的メモリ確保 operator newoperator deleteでアライメント値を取得できるようにする 7 4 No 2017 Update 5
P0091R3: クラステンプレートのテンプレート引数推論 コンストラクタの引数からクラスのテンプレート引数を推論できるようにする 7 5 19.1 2017 Update 7
P0127R2: 非型テンプレート引数のauto宣言 template <typename T, T x>という冗長なコードをtemplate <auto x>のようにして受けられるようにし、
X<3>; X<true>; X<'a'>のように定数を簡潔に渡せるようにする
7 4 19.1 2017 Update 7
P0135R1: 値のコピー省略を保証 一時オブジェクトをコピーする際に、単純な値を持つクラスであればコピーが省略されることを保証する 7 4 19.1 2017 Update 6
P0145R3: 厳密な式の評価順 式の項が評価される順序を厳密に規定する。
b = a;の式が右から順番(a, bの順)に評価される
7 4 19.1 2017 Update 7
P0283R2: 不明な属性を無視する 実装が知らない名前空間の属性は無視する 4.8 3.0 18.0 2015
P0292R2: constexpr if文 if constexpr(cond)とすることで、そのif文はコンパイル時に処理される 7 3.9 19.0 2017 Update 3
P0296R2: 処理の進行保証 並行処理に関して「処理の進行」を明確に定義
(TODO:言葉の定義だけなので実装状況ページからは取り除く)
No No No No
P0386R2: インライン変数 インライン指定を関数だけでなく変数にも指定できるようにする 7 3.9 19.0 2017 Update 5
P0391R0: templated entityという用語を導入 (TODO:言葉の定義だけなので実装状況ページからは取り除く) - - - -
P0217R3: 構造化束縛 タプルやユーザー定義型を分解して受け取れるようにする
tuple<int, string> f();
const auto [a, b] = f(); // aはintの値、bはstringの値
7 4 18.0 2017 Update 3
P0305R1: if文とswitch文の条件式と初期化を分離 if (init; condition)のように初期化と条件式を分けて記述できるようにする 7 3.9 18.0 2017 Update 3
P0137R1: 参照メンバをもつクラスの置き換え 参照型メンバやconstメンバ変数を含むクラスについてこれまで結果は未定義とされていた配置newによるオブジェクトの置き換えを条件付きで可能とする 7 6.0 No 2017 Update 7
P0003R5: 非推奨だった例外仕様を削除 noexceptが入ったことによって非推奨になったthrowキーワードによる例外仕様を削除 7 4 No 2017 Update 5
P0195R2: using宣言でのパック展開 パラメータパックの型を基底クラスとして指定した場合に、using宣言に基底クラスのパラメータパックを指定できるようにする 7 4 No 2017 Update 7
P0512R0: クラステンプレート引数の推論仕様を調整 8 5.0 No 2017 Update 7
P0490R0: Committee Draftに対するNational Body Commentへの対応 - - - -
P0522R0: テンプレートテンプレート引数のマッチングにおいて、互換性のあるテンプレートを除外 7 4 (partial) 19.1 2017 Update 5

各処理系のC++17実装状況ページ:

言語機能 説明 GCC Clang ICC MSVC
P0683R1: ビットフィールドのメンバ変数初期化 ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する 8 6.0 2021.4 2019 Update 5
P0409R2: ラムダ式のキャプチャとして[=, this]を許可する デフォルトコピーキャプチャとthisポインタのコピーキャプチャを両方指定できるようにする 8 6.0 2021.4 2019 Update 2
P0806R2: [=]によるthisの暗黙のキャプチャを非推奨化 コピーのデフォルトキャプチャでは、thisポインタをキャプチャされなくする 9 2019 Update 2
P0428R2: ジェネリックラムダのテンプレート構文 ジェネリックラムダでテンプレートパラメータを定義できるようにする 8 9.0 2021.4 2019 Update 2
P0704R1: const修飾されたメンバポインタの制限を修正 .*演算子での左辺値のconstメンバ関数呼び出しを許可する 8 6.0 2021.4 2015
P0306R4: 可変引数が空でない場合のトークン置換 プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処 8 (partial, #__VA_OPT__による文字列化が未サポート) 6.0
9.0 (p1042)
2021.4 2019 Update 5
P0329R4: 指示付き初期化 8 6.0 (partial) 2021.4 2019 Update 1
P0734R0: コンセプト テンプレートパラメータに対する制約を行う 10 10.0 (partial) 2021.6 2019 Update 3
P0614R1: 初期化式をともなう範囲for文 範囲for文スコープで使用する変数の初期化のための構文を追加 9 8.0 2021.7 2019 Update 5
P0588R1: 暗黙のラムダキャプチャを簡略化 ラムダ式のキャプチャに関する仕様整理 8 No 2021.4 2019 Update 4
P0846R0: 関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正 名前空間内の関数テンプレートをテンプレート引数指定かつ非修飾・ADLで正しく呼び出せるよう修正 9 9.0 2021.4 2019 Update 1
P0641R2: デフォルトのコピーコンストラクタと非constなコンストラクタが衝突する問題を修正 constなオブジェクトをとるコンストラクタを定義すると、そのクラスをラップしたクラスのコピーコンストラクタが不適格になってしまう問題を修正 9 8.0 2021.4 2015
P0859R0: 評価されない文脈での定数式評価によって特殊メンバ関数がインスタンス化されることを規定 sizeofdecltypeなどの評価されない文脈において定数式評価を行った場合に、ムーブコンストラクタのような特殊メンバ関数が定義されることを規定 9 8 Partial in 2019 Update 7
P0515R3: 一貫比較 三方比較演算子によって比較演算子の自動生成を行うようにする 10 8.0 (partial) 2021.4 2019
P0692R1: 特殊化のアクセスチェック Yes partial 2021.4 2019 Update 6
P0624R2: 状態を持たないラムダ式を、デフォルト構築可能、代入可能とする キャプチャしていないラムダ式をデフォルト構築・代入可能にする 9 8.0 2021.4 2019 Update 2
P0767R1: PODを非推奨化 PODという用語を非推奨化する 2021.4 2019 Update 5
P0315R4: 評価されない文脈でのラムダ式 評価されない文脈でもラムダ式を書くことができるようにする 9 Partial 2024.0 2019 Update 8
P0840R2: 空オブジェクトを言語サポート [[no_unique_address]]属性を導入し、空の型のオブジェクトをほかのオブジェクトと共有する最適化を許可する 9 9.0 2021.4 2019 Update 9 †1
P0962R1: 範囲for文がカスタマイゼーションポイントを見つけるルールを緩和 begin()/end()メンバ関数のどちらかが見つからなかった場合に非メンバ関数のbegin()/end()を探しにいく 8 8 2021.4 2019 Update 5
P0969R0: friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 構造化束縛の仕様として公開メンバ変数のみを取り出せるようになっていたが、friend指定された関数からは非公開メンバ変数にもアクセスできるようにする 8 8.0 2021.4 2019
P0961R1: 構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和 非テンプレートのget()メンバ関数が見つかった場合は、非メンバ関数のget()を探しにいく 8 8.0 2021.4 2019
P0634R3: 型の文脈でtypenameの省略を許可 型しか現れない文脈では、依存名を解決するためのtypenameキーワードを省略できるようにする 9 16 2023.1 2019 Update 9
P0780R2: ラムダ式の初期化キャプチャでのパック展開を許可 [...args = std::move(args)]のようなキャプチャを許可 9
10
9.0 2021.7 2019 Update 2
P0479R5: 確率が高い分岐と低い分岐を伝える属性 [[likely]], [[unlikely]] 条件分岐の最適化ヒントを与える属性 9 (partial, switch 文のみ可能)
10
12.0 2021.7 2019 Update 6
P0929R2: 抽象型のチェック 関数の宣言段階では、パラメータおよび戻り値型が抽象型かどうかをチェックしないようにする 11 2019 Update 5
P0732R2: 非型テンプレートパラメータとしてクラス型を許可する 定数式として使用できる型を広く非型テンプレートパラメータとして使用できるようにする 9 partial 2022.2 Partial 2019 Update 6
P0722R3: 可変長データを扱うクラスの効率的なdelete クラスのdelete演算子が呼び出される前にデストラクタが呼ばれないようにするオプションを追加 9 6.0 2023.0 2019 Update 7
P1064R0: 定数式からの仮想関数の呼び出しを許可 仮想関数にconstexprを付けられない制限を解除 9 9.0 2021.4 2019 Update 9
P1327R1: 定数式でのdynamic_cast、多態的なtypeidを許可 定数式での動的多態を許可 10 9.0 2021.4 2019 Update 9
P1002R1: constexpr関数内でのtry-catchブロックを許可 constexpr関数内でtry-catchブロックを書けるようにする 9 8.0 2023.1 2019 Update 5
P1073R3: 即時関数 constevalキーワードを追加し、常に定数式評価されるよう指定できるようにする 11 15 2021.4 2019 Update 10
P1330R0: 定数式内での共用体のアクティブメンバの変更を許可 共用体メンバの書き換えを定数式内で行えるようにする 9 9.0 2021.4 2017
P1008R1: ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止 コンストラクタがdeletedefault宣言されているクラスを、集成体初期化によってコンストラクタ呼び出しを回避して構築できてしまっていた技法を禁止 9 8.0 2021.4 2019
P0892R2: 関数を条件付きでexplicitにする構文を追加 explicit(true)のようにexplicitに真理値パラメータを指定できるようにする 9 9.0 2021.4 2019 Update 2
P1236R1: 符号付き整数型が2の補数表現であることを規定 符号付き整数型のビット表現を2の補数に規定する 9 9.0 2023.0
P0482R6: UTF-8エンコーディングされた文字の型としてchar8_tを追加 UTF-8エンコードされた文字かどうかでオーバーロード・特殊化をできるようにする 9 7 (-fchar8_tオプションが必要) 2021.4 2019 Update 2
P1094R2: 入れ子名前空間定義でのインライン名前空間 namespace ns1::inline ns2::ns3 {}のように、入れ子名前空間を定義する式にインライン名前空間の指定を含められるようにする 9 8.0 2021.4 2019 Update 7
P1091R3: 構造化束縛を拡張して通常の変数宣言のように使用できるようにする 記憶域指定子としてstaticthread_localの指定を許可 10 8.0 (partial) 2021.4 2019 Update 4
P1381R1: 構造化束縛した変数の参照キャプチャを許可 構造化束縛をした変数は特殊な扱いのためラムダ式で参照キャプチャできない規定となっていたがこれを許可する 8 8.0 (partial) 2021.4 2017 Update 3
P0960R3: 丸カッコの値リストからの集成体初期化を許可 T x{1, 2, 3};と同様にT x(1, 2, 3);でも集成体初期化できるようにする 10 No 2021.4 2019 Update 8
P1009R2: new式での配列要素数の推論 double* p = new double[]{1,2,3};を許可 11 9 2021.4 2019 Update 7
P1041R4: char16_tchar32_tの文字・文字列リテラルを、文字コードUTF-16/32に規定 __STDC_UTF_16____STDC_UTF_32__の定義に関係なく、char16_tchar32_tのリテラルをUTF-16/32文字コードに規定する 10 Yes 2023.0 2015
P1103R3: モジュール ヘッダファイル・ソースファイル、インクルードに変わる仕組みとしてモジュールを導入する 11 (-fmodules-tsが必要) 15
8.0 partial (-fmodules, -fmodules-tsが必要)
2023.1 (Partial) 2019 Update 8
P0912R5: コルーチン 関数実行を中断・再開する仕組みとしてコルーチンを導入する 10 (-fcoroutinesが必要) 8.0 (partial) 2021.4 2019 Update 8
P1161R3: 添字演算子内でのカンマ演算子の使用を非推奨化 ar[i, j]を非推奨化。ar[(i, j)]はOK 10 9.0 2021.6 2019 Update 5
P1331R2: constexpr関数内でのトリビアルなデフォルト初期化を許可 constexpr関数内でのデフォルト初期化を許可し、未初期化値を読むことのみ禁止する 10 10.0 2022.3 2019 Update 7
P0848R3: 条件付きで特殊メンバ関数をトリビアルに定義するように 制約によってトリビアルな特殊メンバ関数と非トリビアルな特殊メンバ関数をオーバーロードできるようにする 10 16 Partial (consepts 未実装部あり) 2022.3 2019 Update 8
P1301R4: [[nodiscard]]属性に理由となる文字列を付加できるようにする 関数の戻り値を無視してはならない理由を関数宣言に持たせ、警告メッセージに役立てる 10 9.0 2021.6 2019 Update 5
P1099R5: スコープ付き列挙型のusing宣言 using enum EnumType;もしくはusing EnumType::enumeratorとすることで、列挙値のスコープ指定を省略できるようにする 11 13 2023.0 2019 Update 4
P1816R0: 集成体クラステンプレートのテンプレート引数推論 クラステンプレートのテンプレート引数推論はコンストラクタ引数から推論されるが、集成体初期化からも推論できるようにする 10 No 2024.0 2019 Update 7
P1668R1: constexpr関数内で未評価のインラインアセンブリを許可することによる組み込み関数のconstexpr有効化 コンパイル時に評価されない場合にconstexpr関数にasm定義を含めることを許可 10 10.0 2022.3 2019 Update 9
P0388R4: 要素数不明の配列への変換を許可 要素数が判明している配列から、要素数が不明の配列への変換を許可 10 14 2021.6 2019 Update 7
P1143R2: コンパイル時初期化を強制するconstinitキーワードを追加 初期化のみコンパイル時におわらせたい場合に使用する 10 10.0 2022.3 2019 Update 10
P1152R4: ほとんどのvolatileを非推奨化 volatileの有用な機能のみを残し、効果が疑わしい、または壊れている機能を非推奨化する 10 10.0 2021.6 2019 Update 7
P1814R0: エイリアステンプレート経由でのクラステンプレートのテンプレート引数推論 エイリアステンプレートからクラステンプレートのテンプレート引数を推論できるようにする 10 No 2019 Update 7
P0784R7: 可変サイズをもつコンテナのconstexpr constexpr記憶域をもつメモリアロケータの存在を考慮することで、可変サイズをもつコンテナをコンパイル時に使用できるようにする 10 10.0 2021.6 2019 Update 9
P1957R2: ポインタからboolへの変換を縮小変換とする ポインタからbool値への変換を縮小変換と規定することで、意図しない変換を防止する 10 11.0 2019 Update 7
  • ^ 不明な属性として無視されなくなっただけで期待する効果は得られない。完全に実装されるまでは、代わりに[[msvc::no_unique_address]]を使用できる。

各処理系のC++20実装状況ページ:

言語機能 説明 GCC Clang ICX MSVC
P0330R8: (符号付き)size_tリテラルのためのサフィックス 42z/42Zとすることでsize_tに対応する符号付き整数型のリテラルとする 11 13 2022.2 -
P2290R3: エスケープシーケンスの区切り エスケープシーケンスの範囲を明確にする構文を追加する 13 15 2023.2 -
P2266R3: 暗黙的なムーブを簡略化 参照を返す関数のreturn文で暗黙的にムーブされない問題を修正 13 13 2022.2 -
P1787R6: スコープと名前ルックアップの仕様整理 複雑で不完全になっているスコープと名前ルックアップの仕様を整理し、一部の問題を解決する - - - -
P2615R1: 無意味なexport宣言を禁止する いくつかの不必要な宣言に対するモジュールexportを禁止する - - - -
P2360R0: 初期化文での型の別名宣言を許可 for (using T = int; T e : v) {}を許可 12 14 2022.2 -
P2718R0: 範囲for文が範囲初期化子内で生じた一時オブジェクトを延命することを規定 - - - -
P2324R2: 複合文の末尾へのラベルを許可 C互換のため、複合文の末尾でのgoto文のラベルを許可する 13 16 2023.2 -
P0847R7: 自身のオブジェクトを明示的にパラメータとして指定する メンバ関数が*thisの型・オブジェクトをパラメータとしてとり、*thisオブジェクトがconst/非const、左辺値/右辺値であるかをメンバ関数内で識別できるようにする - 18 - 2022 Update 2 (partial)
P1847R4: アクセス制御の異なるメンバ変数のレイアウトを宣言順に規定 アクセス制御の異なるメンバ変数のレイアウトは並び替えを許可されていたが宣言順に規定する Yes Yes - 2022
P2128R6: 添字演算子の多次元サポート operator[](int x, int y, int z)のように添字演算子のオーバーロードで複数のパラメータをとることを許可 12 15 2022.2 -
P1169R4: thisポインタをもつ必要のない演算子をstaticとして宣言できるようにする 状態をもたないいくつかの演算子をstaticとして宣言できるようにする 13 16 2023.2 -
P2201R1: 異なる文字エンコーディングをもつ文字列リテラルの連結を不適格とする auto a = u8"" L"";のような異なる文字エンコーディング同士での文字列リテラルを連結を禁止する Yes Yes 2022.2 Yes
P2029R4: 文字・文字列リテラル中の数値・ユニバーサルキャラクタのエスケープに関する問題解決 - - - -
P2362R3: 1ワイド文字に収まらないワイド文字リテラルを禁止する エンコード結果としてwchar_tの大きさに収まらないワイド文字リテラルを禁止する 13 14 2023.2 -
P2071R2: 名前付きユニバーサルキャラクタ名 16進数のユニバーサルキャラクタだけでなく、その文字の名前を入力できるようにする 13 15 2023.2 -
P2096R2: 変数テンプレートの部分特殊化を許可 変数テンプレートの部分特殊化を許可するために部分特殊化の仕様を汎用化 - - - -
P2582R1: 継承コンストラクタからのクラステンプレート引数の推論 継承コンストラクタからもクラステンプレート引数を推論できるようにする - - - -
P1938R3: if consteval コンパイル時の文脈かどうかで分岐させる 12 14 - -
P1401R5: 定数式の文脈でのboolへの縮小変換を許可 if constexpr(flags & Flags::Exec)static_assert(N);を許可 9 13 2022.2 -
P2242R3: 定数式内での非リテラル変数、静的変数・スレッドローカル変数およびgotoとラベルの存在を許可する コンパイル時に評価されない限り、定数式内に静的変数・スレッドローカル変数およびgoto文とラベルを含むことを許可する 12 15 2022.2 -
P2246R1: 静的な診断メッセージの文字エンコーディング static_assert[[deprecated]]などの診断メッセージの文字集合に関する要件をなくす - yes - 2022
P2448R2: constexpr関数が定数実行できない場合でも適格とする 13 17 (partial) 2024.0 (partial) -
P2647R1: constexpr関数内でのstatic constexpr変数を許可 constexpr関数のローカルで定数を定義できるようにする 13 16 2023.2 -
P2564R3: constexpr関数内でconsteval関数を呼び出せない問題を緩和 consteval呼び出しを含むconstexpr関数を条件付きでconsteval関数とみなすようにする - 17 - 2024.0
P1102R2: ラムダ式で()を省略できる条件を緩和 修飾や戻り値型をともなってもパラメータリストが空であれば()を省略できる 11 13 2022.2 -
P2173R1: ラムダ式に対する属性 ラムダ式のいくつかの箇所に属性を記述できるようにする 9 13 2022.2 -
P1774R8: コード内容の仮定をコンパイラに伝えるassume属性 最適化のために、コードの仮定をコンパイラに伝える属性を標準化する 13 - - -
P2316R2: 文字リテラルエンコーディングを一貫させる プリプロセッサの条件式での文字リテラルの扱いをC++式と同様にする yes yes 2022.2 2022
P2334R1: elif/elifdef/elifndefのサポートを追加 #if/#ifdef/#ifndefに対応する複数条件命令のサポートを追加する 12 13 2022.2 -
P2437R1: #warningのサポートを追加 多くのC++コンパイラが実装していたプリプロセス時の警告#warning messageを正式サポート yes yes 2023.2 yes
P2295R6: 汎用的なソースコードのエンコーディングとしてUTF-8をサポート すべてのコンパイラはUTF-8文字コードのソースコードをサポートしなければならない 13 15 2023.2 2019 Update 2
P2223R2: 行末スペースを無視するよう規定 行末が「\ 」でおわっていた場合にMSVCは行の継続をしない実装になっていたため動作を共通化するため仕様を規定 Yes Yes 2022.2 -

各処理系のC++23実装状況ページ:

言語機能 説明 GCC Clang ICX MSVC
P2752R3: std::initializer_listの配列を静的ストレージに配置する std::vector v = {1, 2, 3};のような初期化で初期化子リストを静的ストレージに配置することで無駄なコピーをなくす 14
P2169R4: 宣言のみで使用しない変数の名前として_をサポート 変数名_は暗黙で[[maybe_unused]]が指定される 14 18
P1854R4: 文字列リテラルの文字エンコーディング失敗を不適格とする 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする 14 14
P2361R6: コンパイル時にのみ使用される文字列の扱いを明確化 static_assert[[deprecated]]などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定 14 18
P2552R3: 属性の無視性を見直し 構文として適格な属性のみを無視できるようにし、そうでない属性の使用を不適格とする
P2738R1: 定数式でのvoid*からポインタ型へのキャストを許可 型消去のためにvoid*からポインタ型へのキャストを許可する 14 17
P2741R3: static_assertの診断メッセージにユーザーが生成した文字列の指定を許可 constexprS.size()S.data()メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする 14 17
P2558R2: 基本文字集合に@、$、`を追加 C言語との互換性のためにこれらの文字を基本文字集合に追加 Yes
P2662R3: パラメータパックへのインデックスアクセスを許可 可変引数テンプレートのパラメータパックに添字アクセスできるようにする
P2864R2: 非推奨となっていた列挙値から算術型への暗黙変換を削除 C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除 14 18

各処理系のC++26実装状況ページ: