最終更新日時(UTC):
が更新

履歴 編集

コンパイラの実装状況

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

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

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

言語機能 説明 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実装状況ページ:

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

言語機能 説明 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実装状況ページ:

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

言語機能 説明 GCC Clang ICC MSVC
メッセージなしのstatic_assert デフォルトの表明メッセージを使用する 6 3.5 18.0 2017
トライグラフを削除 5.1 3.5 No 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 No 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
非型テンプレートパラメータの定数式を評価する nullptrから任意の型のポインタへの変換等をテンプレート引数の指定時に行う 6 3.6 No 2017 Update 5
非推奨だったregisterキーワードを削除 7 3.8 18.0 2017 Update 3
非推奨だったbool型オブジェクトに対するインクリメントの仕様を削除 7 3.8 18.0 2017 Update 3
例外仕様を型システムの一部にする 7 4 No 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 No 2017 Update 7
ラムダ式をconstexprとして使用できるようにする ラムダ式の関数オブジェクトが定数式の文脈で使用された場合に、それがコンパイル時に評価されるようにする 7 5 No 2017 Update 3
範囲for文のためのbegin()end()関数が、異なる型を返すことを許可 begin()end()が異なるイテレータ型を返せるようにすることで、終端イテレータを定義しやすくする 6 3.9 18.0 2017
ラムダ式での*thisのコピーキャプチャ キャプチャリストに*thisを指定することで、*thisをコピーキャプチャする 7 3.8 No 2017 Update 3
enum class変数の初期値として整数を指定する際の規則を調整 キャストを使用することなく整数を初期値として使用し、E e{0};のような初期化を許可 7 1.9 No 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 No 2017 Update 7
非型テンプレート引数のauto宣言 template <typename T, T x>という冗長なコードをtemplate <auto x>のようにして受けられるようにし、
X<3>; X<true>; X<'a'>のように定数を簡潔に渡せるようにする
7 4 No 2017 Update 7
値のコピー省略を保証 一時オブジェクトをコピーする際に、単純な値を持つクラスであればコピーが省略されることを保証する 7 4 No 2017 Update 6
厳密な式の評価順 P0145R3 P0400R0 式の項が評価される順序を厳密に規定する。
b = a;の式が右から順番(a, bの順)に評価される
7 4 No 2017 Update 7
不明な属性を無視する 実装が知らない名前空間の属性は無視する 4.8 3.0 18.0 No
if constexpr文 if constexpr(cond)とすることで、そのif文はコンパイル時に処理される 7 3.9 No 2017 Update 3
処理の進行保証 並行処理に関して「処理の進行」を明確に定義
(TODO:言葉の定義だけなので実装状況ページからは取り除く)
No No No No
インライン変数 インライン指定を関数だけでなく変数にも指定できるようにする 7 3.9 No 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によるオブジェクトの置き換えを条件付きで可能とする No No No 2017 Update 7
非推奨だった例外仕様を削除 noexceptが入ったことによって非推奨になったthrowキーワードによる例外仕様を削除 7 4 No 2017 Update 5
using宣言でのパック展開 パラメータパックの型を基本クラスとして指定した場合に、using宣言に基本クラスのパラメータパックを指定できるようにする 7 4 No 2017 Update 7
クラステンプレート引数の推論仕様を調整 No No No 2017 Update 7
Committee Draftに対するNational Body Commentへの対応 - - - -
テンプレートテンプレート引数のマッチングにおいて、互換性のあるテンプレートを除外 7 4 (partial) No 2017 Update 5

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

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

言語機能 説明 GCC Clang ICC MSVC
ビットフィールドのメンバ変数初期化 ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する 8 6.0
ラムダ式のキャプチャとして[=, this]を許可する デフォルトコピーキャプチャとthisポインタのコピーキャプチャを両方指定できるようにする 8 6.0
ジェネリックラムダのテンプレート構文 ジェネリックラムダでテンプレートパラメータを定義できるようにする
const修飾されたメンバポインタの制限を修正 .*演算子での左辺値のconstメンバ関数呼び出しを許可する 8 6.0
可変引数が空でない場合のトークン置換 プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処 8 (partial, #__VA_OPT__による文字列化が未サポート) 6.0
指示付き初期化 8 6.0 (partial)
コンセプト
範囲for文で初期化式を記述できるようにする
暗黙のラムダキャプチャを簡略化 8
関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正
デフォルトのコピーコンストラクタと非constなコンストラクタが衝突する問題を修正
評価されない文脈でconstexpr関数が定数式評価されることを規定
一貫性ある比較
ラムダ式の制約
特殊化のアクセスチェック
状態を持たないラムダ式を、デフォルト構築可能、代入可能とする
PODを非推奨化
評価されない文脈でのラムダ式
空オブジェクトを言語サポート [[no_unique_address]]属性を導入し、空の型のオブジェクトをほかのオブジェクトと共有する最適化を許可する
範囲for文がカスタマイゼーションポイントを見つけるルールを緩和 begin()/end()メンバ関数のどちらかが見つからなかった場合に非メンバ関数のbegin()/end()を探しにいく 8
friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 構造化束縛の仕様として公開メンバ変数のみを取り出せるようになっていたが、friend指定された関数からは非公開メンバ変数にもアクセスできるようにする
構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和 非テンプレートのget()メンバ関数が見つかった場合は、非メンバ関数のget()を探しにいく
型の文脈でtypenameの省略を許可 型しか現れない文脈では、依存名を解決するためのtypenameキーワードを省略できるようにする
ラムダ式の初期化キャプチャでのパック展開を許可 [...args = std::move(args)]のようなキャプチャを許可
当たる確率が高い分岐と、当たる確率が低い分岐をコンパイラに伝える属性を追加 コンパイラが分岐予測するためのヒントとする
宇宙船演算子に対称性をもたせる a <=> bが妥当であればb <=> aも妥当とする

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