最終更新日時:
が更新

履歴 編集

コンパイラの実装状況

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

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

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

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

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

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

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

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

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

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

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

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

言語機能 説明 GCC Clang ICC MSVC
ビットフィールドのメンバ変数初期化 ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する
ラムダ式のキャプチャとして[=, this]を許可する デフォルトコピーキャプチャとthisポインタのコピーキャプチャを両方指定できるようにする
ジェネリックラムダのテンプレート構文 ジェネリックラムダでテンプレートパラメータを定義できるようにする
const修飾されたメンバポインタの制限を修正 .*演算子での左辺値のconstメンバ関数呼び出しを許可する
可変引数が空でない場合のトークン置換 プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処
指示付き初期化
コンセプト