最終更新日時: 2026年07月21日 15時10分52秒 (JST)
rotarymars が更新

履歴 編集

# コンパイラの実装状況

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

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

- C++11
- C++14
- C++17
- C++20
- C++23
- C++26

## C++11言語機能の実装状況

言語機能 | 説明 | 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_t`と`char32_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: `override`と`final` | メンバ関数のオーバーライド指定、および派生クラスでのオーバーロードを禁止する指定 | 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実装状況ページ：

- 全体的な対応状況： C++0xCompilerSupport
- GCC： C++11 Support in GCC
- libstdc++ : C++ 2011
- Clang： C++98 and C++11 Support in Clang
  - C++ Defect Report Support in Clang
- ICC : C++11 Features Supported by Intel® C++ Compiler
- Visual C++ (MSVC):
  - Visual C++ 言語への準拠
  - Announcing: MSVC Conforms to the C++ Standard

## C++14言語機能の実装状況

言語機能 | 説明 | 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: C++14 Support in GCC
- libstdc++: C++ 2014
- Clang: C++98, C++11, and C++14 Support in Clang
- Visual C++ (MSVC):
  - Visual C++ 言語への準拠
  - Announcing: MSVC Conforms to the C++ Standard
- ICC: C++14 Features Supported by Intel C++ Compiler
  - Intel (R) Parallel Studio XE 2016 Beta program has begun

## C++17言語機能の実装状況

言語機能 | 説明 | 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: 単一要素の波カッコ初期化を非配列とする | `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`節で`break`や`return`を書かなかった場合に、それが意図したフォールスルーであることをコンパイラに伝える属性 | 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()`が異なるイテレータ型を返せるようにすることで、終端イテレータを定義しやすくする | 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 new`と`operator delete`でアライメント値を取得できるようにする | 7 | 4 | 19.0 | 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
P0386R2: インライン変数 | インライン指定を関数だけでなく変数にも指定できるようにする | 7 | 3.9 | 19.0 | 2017 Update 5
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 | 19.0 | 2017 Update 5
P0195R2: using宣言でのパック展開 | パラメータパックの型を基底クラスとして指定した場合に、`using`宣言に基底クラスのパラメータパックを指定できるようにする | 7 | 4 | 19.0 | 2017 Update 7
P0512R0: クラステンプレート引数の推論仕様を調整 |  | 8 | 5.0 | - | 2017 Update 7
P0490R0: Committee Draftに対するNational Body Commentへの対応 |  | - | - | - | -
P0522R0: テンプレートテンプレート引数のマッチングにおいて、互換性のあるテンプレートを除外 |  | 7 | 4 (partial) 19 | 19.1 | 2017 Update 5

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

- GCC: C++17 Support in GCC
- Clang: C++ Support in Clang
- libc++ : libc++ C++17 Status
- Visual C++ (MSVC):
  - Visual C++ 言語への準拠
  - Announcing: MSVC Conforms to the C++ Standard
- ICC: C++17 Features Supported by Intel C++ Compiler

## C++20言語機能の実装状況

言語機能 | 説明 | 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 | - | No | 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__`による文字列化が未サポート) 10 (partial, placemarker token のハンドリング変更なし) 12 | 6.0 9.0 (p1042) | 2021.4 | 2019 Update 5
P0329R4: 指示付き初期化 | 波カッコによる集成体初期化でメンバ名を指定して初期化できるようにする | 8 | 6.0 (partial) 10 | 2021.4 | 2019 Update 1
P0734R0: コンセプト | テンプレートパラメータに対する制約を行う | 10 | 10 | 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: 評価されない文脈での定数式評価によって特殊メンバ関数がインスタンス化されることを規定 | `sizeof`や`decltype`などの評価されない文脈において定数式評価を行った場合に、ムーブコンストラクタのような特殊メンバ関数が定義されることを規定 | 9 | 8 | No | 2019 Update 7 (partial) 2022 Update 1
P0515R3: `<=>`/`==`による比較演算子の自動定義 | 三方比較演算子によって比較演算子の自動生成を行うようにする | 10 | 8.0 (partial) 10 | 2021.4 | 2019
P0692R1: 特殊化のアクセスチェック |  | Yes | 14 | 2021.4 | 2019 Update 6
P0624R2: 状態を持たないラムダ式を、デフォルト構築可能、代入可能とする | キャプチャしていないラムダ式をデフォルト構築・代入可能にする | 9 | 8.0 | 2021.4 | 2019 Update 2
P0767R1: PODを非推奨化 | PODという用語を非推奨化する | 10.1 | 21 | 2021.4 | 2019 Update 5
P0315R4: 評価されない文脈でのラムダ式 | 評価されない文脈でもラムダ式を書くことができるようにする | 9 | 17 | 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 | - | No | 2019 Update 5
P0732R2: 非型テンプレートパラメータとしてクラス型を許可する | 定数式として使用できる型を広く非型テンプレートパラメータとして使用できるようにする | 9 | 12 | 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` | `consteval`キーワードを追加し、常に定数式評価されるよう指定できるようにする | 11 | 15 | 2021.4 | 2019 Update 10
P1330R0: 定数式内での共用体のアクティブメンバの変更を許可 | 共用体メンバの書き換えを定数式内で行えるようにする | 9 | 9.0 | 2021.4 | 2017
P1008R1: ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止 | コンストラクタが`delete`／`default`宣言されているクラスを、集成体初期化によってコンストラクタ呼び出しを回避して構築できてしまっていた技法を禁止 | 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 | 2022 Update 14
P0482R6: UTF-8エンコーディングされた文字の型として`char8_t`を追加 | UTF-8エンコードされた文字かどうかでオーバーロード・特殊化をできるようにする | 9 | 7 (`-fchar8_t`オプションが必要) 8 (`-std=c++20`で有効化) | 2021.4 | 2019 Update 2
P1094R2: 入れ子名前空間定義でのインライン名前空間 | `namespace ns1::inline ns2::ns3 {}`のように、入れ子名前空間を定義する式にインライン名前空間の指定を含められるようにする | 9 | 8.0 | 2021.4 | 2019 Update 7
P1091R3: 構造化束縛を拡張して通常の変数宣言のように使用できるようにする | 記憶域指定子として`static`と`thread_local`の指定を許可 | 10 | 8.0 (partial) 16 | 2021.4 | 2019 Update 4
P1381R1: 構造化束縛した変数の参照キャプチャを許可 | 構造化束縛をした変数は特殊な扱いのためラムダ式で参照キャプチャできない規定となっていたがこれを許可する | 8 | 8.0 (partial) 16 | 2021.4 | 2017 Update 3
P0960R3: 丸カッコの値リストからの集成体初期化を許可 | `T x{1, 2, 3};`と同様に`T x(1, 2, 3);`でも集成体初期化できるようにする | 10 | 16 | 2021.4 | 2019 Update 8
P1009R2: `new`式での配列要素数の推論 | `double* p = new double[]{1,2,3};`を許可 | 11 | 9 | 2021.4 | 2019 Update 7
P1041R4: `char16_t`と`char32_t`の文字・文字列リテラルを、文字コードUTF-16/32に規定 | `__STDC_UTF_16__`、`__STDC_UTF_32__`の定義に関係なく、`char16_t`、`char32_t`のリテラルをUTF-16/32文字コードに規定する | 10 | Yes | 2023.0 | 2015
P1103R3: モジュール | ヘッダファイル・ソースファイル、インクルードに変わる仕組みとしてモジュールを導入する | 11 (`-fmodules-ts`が必要) | 8.0 partial (`-fmodules`, `-fmodules-ts`が必要) 15 | 2023.1 (partial) | 2019 Update 8
P0912R5: コルーチン | 関数実行を中断・再開する仕組みとしてコルーチンを導入する | 10 (`-fcoroutines`が必要) 11 (`-std=c++20`で有効化) | 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) 19 | 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 | 17 | 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 | 19 (partial) | 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: C++20 Support in GCC
- Clang: C++ Support in Clang
- libstdc++: C++ 2020 Implementation Status
- libc++: libc++ C++20 Status
- Visual C++ (MSVC):
  - Microsoft C/C++ language conformance by Visual Studio version
  - Visual C++ 言語への準拠
  - 次リリース情報(VS2019,2022) - Change log
- ICC: C++20 Features Supported by Intel® C++ Compiler

## C++23言語機能の実装状況

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

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

- GCC: C++23 Support in GCC
- Clang: C++23 implementation status
- Visual C++ (MSVC):
  - Microsoft C/C++ language conformance by Visual Studio version
  - C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022
  - C++ Language Updates in MSVC in Visual Studio 2022 17.13
  - MSVC Compiler Language Updates in Visual Studio 2022 version 17.12
  - C++ Language Updates in MSVC in Visual Studio 2022 17.14
  - C/C++ Conformance improvements, behavior changes, and bug fixes in Microsoft C++ (MSVC) Build Tools
- ICX: C++23 Features Supported by Intel® C++ Compiler

## C++26言語機能の実装状況

言語機能 | 説明 | 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: 属性の無視性を見直し | 構文として適格な属性のみを無視できるようにし、そうでない属性の使用を不適格とする | 15 |  |  |
P2738R1: 定数式での`void*`からポインタ型へのキャストを許可 | 型消去のために`void*`からポインタ型へのキャストを許可する | 14 | 17 |  |
P2741R3: `static_assert`の診断メッセージにユーザーが生成した文字列の指定を許可 | `constexpr`な`S.size()`と`S.data()`メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする | 14 | 17 |  |
P2558R2: 基本文字集合に@、$、`を追加 | C言語との互換性のためにこれらの文字を基本文字集合に追加 | 15 | Yes |  |
P2662R3: パラメータパックへのインデックスアクセスを許可 | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする | 15 | 19 |  |
P2864R2: 非推奨となっていた列挙値から算術型への暗黙変換を削除 | C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除 | 14 | 18 |  |
P2748R5: 返却された左辺値から暗黙変換された一時オブジェクトが参照に束縛されることを禁止する | 寿命切れの変数によって引き起こされるバグを防止する | 14 | 19 |  |
P3106R1: 要素数不明の配列を集成体初期化する規則を明確化 | 配列要素の集成体初期化で`{}`が省略された場合の矛盾していた規定を修正 | yes | 17 |  |
P0609R3: 構造化束縛への属性を許可 | `auto [a, b [[maybe_unused]], c] = f();`のように構造化束縛の要素に対して属性を付加できるようにする | 15 | 19 |  |
P3034R1: モジュール宣言でのモジュール名のマクロ展開を禁止する | `export module MACRO_NAME;`を禁止 | 15 |  |  |
P2809R3: 空の無限ループは未定義動作ではないと規定 | 並行プログラムの進行保証などを考慮して空の無限ループを未定義動作ではないものとする | 14 | 19 |  |
P2795R5: 未初期化変数の読み取りをエラー性動作とする | 初期化されていない自動変数の読み取りの安全性を規定する | 16 |  |  |
P2573R2: 関数宣言を削除する理由を指定できるようにする | `f() = delete("reason");` | 15 | 19 |  |
P2893R3: 可変引数テンプレートで`friend`宣言をできるようにする | クラステンプレートの可変引数テンプレートでまとめて`friend`宣言できるようにする | 15 | 20 |  |
P2747R2: `constexpr`配置`new` | 定数式の文脈での配置`new`を許可 | 15 | 20 |  |
P3144R2: 不完全型へのポインタに対する`delete`を不適格とする | 未定義動作を引き起こす操作をコンパイルエラーとする | 15 | 19 |  |
P2963R3: 制約式内での畳み込み式の順序付け | 畳み込み式を含む制約の包摂関係を認識できるようにし、オーバーロード解決の曖昧さを解消する |  | 19 |  |
P0963R3: 条件式での構造化束縛の使用を許可 | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする | 15 |  |  |
P2686R5: `constexpr`構造化束縛の許可と、`constexpr`参照の制限緩和 | 定数式に対する構造化束縛を許可し、関連して`constexpr`参照の制限を緩和して自動変数も参照できるようにする | 16 |  |  |
P3068R6: 定数評価での例外送出を許可 | 定数式の文脈での例外の送出と捕捉を許可 | 16 |  |  |
P2865R6: 非推奨だった組み込み配列の比較を削除 | C++20で非推奨となっていた配列比較を削除 | 15 | 20 |  |
P1061R10: 構造化束縛でパックを導入できるようにする | タプルを分解する際に複数の変数をパックとして宣言できるようにする。`auto [a, ...xs] = f();` | 16 |  |  |
P3176R0: 先行するカンマのない省略記号を非推奨化 | `void f(int, ...);`はOK。`void f(int...);`は非推奨 | 15 | 20 |  |
P3074R7: 共用体の特殊メンバ関数のトリビアル化 | 非トリビアルな型をメンバにもつ共用体のデフォルトコンストラクタとデストラクタをトリビアルにし、未初期化ストレージとして使用可能にする |  |  |  |
P2900R14: 契約プログラミングをサポートする | 関数の事前条件、事後条件、不変条件を記述できるようにする | 16 |  |  |
P2841R7: コンセプトと変数テンプレートをテンプレート引数として渡せるようにする | テンプレートテンプレートパラメータとして、クラステンプレートやエイリアステンプレートに加え、コンセプトと変数テンプレートも渡せるようにする |  |  |  |
P1967R14: ファイルを読み込む`#embed`命令を追加 | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる | 15 |  |  |
P3618R0: `main`関数をグローバルモジュールに含められるようにする | `main`関数に`extern "C++"`を指定できるようにすることで名前付きモジュールに含められるようにする | 16 | 21 |  |
P2996R13: 静的リフレクション | リフレクション演算子`^^`と`std::meta::info`型によりコンパイル時にさまざまな情報を取得できる | 16 (`-freflection` オプション指定) |  |  |
P1306R5: コンパイル時のタプルやリストを展開処理する`template for`文 | タプル・構造体・Range・パラメータパックなどの各要素に対してコンパイル時に文を展開する`template for`文を追加 | 16 |  |  |
P3533R2: `constexpr`仮想継承を許可 | 定数式の文脈での仮想継承を許可 | 16 |  |  |
P2843R3: プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更 | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更 | 16 |  |  |
P3868R1: モジュール宣言より前での`#line`ディレクティブの使用を許可する | モジュール宣言より前での`#line`ディレクティブの使用を禁止していたのは過度な制限だった |  |  |  |
P4136R2: `#line`ディレクティブの制約を現実の実装に合わせて緩和する | `#line 0`や`#line 2147483648`のような行番号指定を不適格としていたが、条件付きサポートとして許可する |  | yes |  |
P4004R1: 可変引数テンプレートの半順序を再検討する | 可変引数テンプレートの部分特殊化の半順序ルールを再検討して、より一貫したルールにする |  |  |  |
P3865R3: テンプレートテンプレートパラメータに対するクラステンプレートパラメータ引数推論 | テンプレートテンプレートパラメータからクラステンプレート引数を推論できるようにクラステンプレートのテンプレート引数推論を拡張する |  |  |  |
P3726R2: 共用体の生存期間ルールの調整 | `union`メンバの活性化や生存期間に関する規則を整理して`constexpr`評価などの一貫性を改善する |  |  |  |
P4143R0: 定数評価の開始・終了タイミングを明確化 | 定数評価がどのタイミングで開始・終了するかを明確化し、constexprコンテキストの規則を整える |  |  |  |
P4149R1: 「immediate context」の定義を明確化 | SFINAEにおける「immediate context」の用語を厳密に定義し、置換失敗の範囲を明確にする |  |  |  |
P3769R1: 配置newの解放処理を明確化 | 配置`new`で確保したメモリの解放処理の取り扱いに関するルールを明確化する |  |  |  |

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

- GCC: C++26 Support in GCC
- Clang:
  - C++2c implementation status
  - libc++ Format Status
- Visual C++ (MSVC):
  - Microsoft C/C++ language conformance by Visual Studio version
  - C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022