Skip to content

Latest commit

 

History

History
276 lines (246 loc) · 39.3 KB

implementation-status.md

File metadata and controls

276 lines (246 loc) · 39.3 KB

コンパイラの実装状況

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

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

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

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

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

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

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

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

言語機能 説明 GCC Clang ICC MSVC
ビットフィールドのメンバ変数初期化 ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する 8 6.0
ラムダ式のキャプチャとして[=, this]を許可する デフォルトコピーキャプチャとthisポインタのコピーキャプチャを両方指定できるようにする 8 6.0 2019 Update 1
[=]によるthisの暗黙のキャプチャを非推奨化 コピーのデフォルトキャプチャでは、thisポインタをキャプチャされなくする 9
ジェネリックラムダのテンプレート構文 ジェネリックラムダでテンプレートパラメータを定義できるようにする 8 9.0 2019 Update 2
const修飾されたメンバポインタの制限を修正 .*演算子での左辺値のconstメンバ関数呼び出しを許可する 8 6.0 2015
可変引数が空でない場合のトークン置換 プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処 8 (partial, #__VA_OPT__による文字列化が未サポート) 6.0
9.0 (p1042)
指示付き初期化 8 6.0 (partial) 2019 Update 1
コンセプト テンプレートパラメータに対する制約を行う 2019 Update 3
初期化式をともなう範囲for文 範囲for文スコープで使用する変数の初期化のための構文を追加 9 8.0
暗黙のラムダキャプチャを簡略化 8
関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正 9 9.0 2019 Update 1
デフォルトのコピーコンストラクタと非constなコンストラクタが衝突する問題を修正 9 8.0
評価されない文脈でconstexpr関数が定数式評価されることを規定 9
一貫性ある比較 8.0 (partial) 2019
ラムダ式の制約
特殊化のアクセスチェック Yes
状態を持たないラムダ式を、デフォルト構築可能、代入可能とする 9 8.0 2019 Update 2
PODを非推奨化
評価されない文脈でのラムダ式 9
空オブジェクトを言語サポート [[no_unique_address]]属性を導入し、空の型のオブジェクトをほかのオブジェクトと共有する最適化を許可する 9 9.0
範囲for文がカスタマイゼーションポイントを見つけるルールを緩和 begin()/end()メンバ関数のどちらかが見つからなかった場合に非メンバ関数のbegin()/end()を探しにいく 8
friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 構造化束縛の仕様として公開メンバ変数のみを取り出せるようになっていたが、friend指定された関数からは非公開メンバ変数にもアクセスできるようにする 8
構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和 非テンプレートのget()メンバ関数が見つかった場合は、非メンバ関数のget()を探しにいく 8
型の文脈でtypenameの省略を許可 型しか現れない文脈では、依存名を解決するためのtypenameキーワードを省略できるようにする 9
ラムダ式の初期化キャプチャでのパック展開を許可 [...args = std::move(args)]のようなキャプチャを許可 8 9.0 2019 Update 2
当たる確率が高い分岐と、当たる確率が低い分岐をコンパイラに伝える属性を追加 コンパイラが分岐予測するためのヒントとする 9
宇宙船演算子に対称性をもたせる a <=> bが妥当であればb <=> aも妥当とする 2019 Update 2
抽象型のチェック 関数の宣言段階では、パラメータおよび戻り値型が抽象型かどうかをチェックしないようにする
非型テンプレートパラメータとしてクラス型を許可する std::strong_equalityに変換可能な非メンバ関数<=>をもつ型を、非型テンプレートパラメータとして使用できるようにする 9
可変長データを扱うクラスの効率的なdelete クラスのdelete演算子が呼び出される前にデストラクタが呼ばれないようにするオプションを追加 9 6.0
定数式からの仮想関数の呼び出しを許可 仮想関数にconstexprを付けられない制限を解除 9 9.0
定数式でのdynamic_cast、多態的なtypeidを許可 定数式での動的多態を許可 9 9.0
constexpr関数内でのtry-catchブロックを許可 constexpr関数内でtry-catchブロックを書けるようにする 9 8.0
即時関数 constevalキーワードを追加し、常に定数式評価されるよう指定できるようにする
定数式内での共用体のアクティブメンバの変更を許可 共用体メンバの書き換えを定数式内で行えるようにする 9 9.0 2017
ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止 コンストラクタがdelete宣言されているクラスを、集成体初期化によってコンストラクタ呼び出しを回避して構築できてしまっていた技法を禁止 9 8.0 2019
契約に基づくプログラミング 事前条件、事後条件、表明を宣言する新たな属性構文を追加
関数を条件付きでexplicitにする構文を追加 explicit(true)のようにexplicitに真理値パラメータを指定できるようにする 9 9.0 2019 Update 2
符号付き整数型が2の補数表現であることを規定 符号付き整数型のビット表現を2の補数に規定する 9 9.0
UTF-8エンコーディングされた文字の型としてchar8_tを追加 UTF-8エンコードされた文字かどうかでオーバーロード・特殊化をできるようにする 9 7 (-fchar8_tオプションが必要) 2019 Update 2
入れ子名前空間定義でのインライン名前空間 namespace ns1::inline ns2::ns3 {}のように、入れ子名前空間を定義する式にインライン名前空間の指定を含められるようにする 9 8.0
構造化束縛を拡張して通常の変数宣言のように使用できるようにする 記憶域指定子としてstaticthread_localの指定を許可 10 8.0 (partial)
構造化束縛したビットフィールドの参照キャプチャ ビットフィールドを含む構造化束縛をした場合にラムダ式で参照キャプチャできない規定を緩和し、ビットフィールドを直接参照キャプチャ、もしくはデフォルト参照キャプチャして使用しなければ適格とする 8 8.0 (partial)
丸カッコの値リストからの集成体初期化を許可 T x{1, 2, 3};と同様にT x(1, 2, 3);でも集成体初期化できるようにする
new式での配列要素数の推論 double* p = new double[]{1,2,3};を許可
char16_tchar32_tの文字・文字列リテラルを、文字コードUTF-16/32に規定 __STDC_UTF_16____STDC_UTF_32__の定義に関係なく、char16_tchar32_tのリテラルをUTF-16/32文字コードに規定する Yes 2015
モジュール ヘッダファイル・ソースファイル、インクルードに変わる仕組みとしてモジュールを導入する 8.0 partial (-fmodules, -fmodules-tsが必要)
コルーチン 関数実行を中断・再開する仕組みとしてコルーチンを導入する 8.0 (partial)
添字演算子内でのカンマ演算子の使用を非推奨化 ar[i, j]を非推奨化。ar[(i, j)]はOK 10 9.0
constexprの文脈での自明なデフォルト初期化を許可 constexpr関数内でのデフォルト初期化を許可し、未初期化値を読むことのみ禁止する
特殊メンバ関数の条件付き自明定義 制約によって自明な特殊メンバ関数と非自明な特殊メンバ関数をオーバーロードできるようにする
[[nodiscard]]属性に理由となる文字列を付加できるようにする 関数の戻り値を無視してはならない理由を関数宣言に持たせ、警告メッセージに役立てる 9.0
スコープ付き列挙型のusing宣言 using enum EnumType;もしくはusing EnumType::enumeratorとすることで、列挙値のスコープ指定を省略できるようにする
集成体クラステンプレートのテンプレート引数推論 クラステンプレートのテンプレート引数推論はコンストラクタ引数から推論されるが、集成体初期化からも推論できるようにする
constexpr関数内で未評価のインラインアセンブリを許可することによる組み込み関数のconstexpr有効化 コンパイル時に評価されない場合にconstexpr関数にasm定義を含めることを許可 10
要素数不明の配列への変換を許可 要素数が判明している配列から、要素数が不明の配列への変換を許可
コンパイル時初期化を強制するconstinitキーワードを追加 初期化のみコンパイル時におわらせたい場合に使用する 10
ほとんどのvolatileを非推奨化 volatileの有用な機能のみを残し、効果が疑わしい、または壊れている機能を非推奨化する 10
エイリアステンプレートに対するクラステンプレートのテンプレート引数推論 エイリアステンプレートからクラステンプレートのテンプレート引数を推論できるようにする
可変サイズをもつコンテナのconstexpr constexpr記憶域をもつメモリアロケータの存在を考慮することで、可変サイズをもつコンテナをコンパイル時に使用できるようにする

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