このページでは、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_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
- ICC : C++11 Features Supported by Intel® C++ Compiler
- Visual C++ (MSVC):
言語機能 | 説明 | 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
- libc++: libc++ C++14 Status
- Visual C++ (MSVC):
- ICC: C++14 Features Supported by Intel C++ Compiler
言語機能 | 説明 | 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 節で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() 関数が、異なる型を返すことを許可 |
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 | 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: C++17 Support in GCC
- Clang: C++ Support in Clang
- libc++ : libc++ C++17 Status
- Visual C++ (MSVC):
- ICC: C++17 Features Supported by Intel C++ Compiler
言語機能 | 説明 | 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: 評価されない文脈での定数式評価によって特殊メンバ関数がインスタンス化されることを規定 | sizeof やdecltype などの評価されない文脈において定数式評価を行った場合に、ムーブコンストラクタのような特殊メンバ関数が定義されることを規定 |
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: ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止 | コンストラクタが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 | |
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: 構造化束縛を拡張して通常の変数宣言のように使用できるようにする | 記憶域指定子としてstatic とthread_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_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 が必要) |
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: C++20 Support in GCC
- Clang: C++ Support in Clang
- libstdc++: C++ 2020 Implementation Status
- libc++: libc++ C++20 Status
- Visual C++ (MSVC):
- ICC: C++20 Features Supported by Intel® C++ Compiler
言語機能 | 説明 | 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: C++23 Support in GCC
- Clang: C++2b implementation status
- Visual C++ (MSVC):
- ICX: C++23 Features Supported by Intel® C++ Compiler
言語機能 | 説明 | 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 の診断メッセージにユーザーが生成した文字列の指定を許可 |
constexpr なS.size() とS.data() メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする |
14 | 17 | ||
P2558R2: 基本文字集合に@、$、`を追加 | C言語との互換性のためにこれらの文字を基本文字集合に追加 | Yes | |||
P2662R3: パラメータパックへのインデックスアクセスを許可 | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする | ||||
P2864R2: 非推奨となっていた列挙値から算術型への暗黙変換を削除 | C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除 | 14 | 18 |
各処理系のC++26実装状況ページ:
- GCC: C++26 Support in GCC
- Clang: C++2c implementation status
- Visual C++ (MSVC):