#コンパイラの実装状況 このページでは、C++のバージョンごとの言語機能を、どのコンパイラがどのバージョンからサポートしているかをまとめる。
ライブラリ機能については、本サイトのリファレンスで各機能を参照してもらいたい。
MSVC(Microsoft Visual C++)のバージョン表記の、製品との対応付けは以下のようになっている:
MSVCのバージョン | 製品のバージョン |
---|---|
6.0 | Visual Studio 6.0 |
7.0 | Visual Studio .NET 2002 |
7.1 | Visual Studio .NET 2003 |
8.0 | Visual Studio 2005 |
9.0 | Visual Studio 2008 |
10.0 | Visual Studio 2010 |
11.0 | Visual Studio 2012 |
##C++11言語機能の実装状況
言語機能 | 説明 | GCC | Clang | ICC | MSVC |
---|---|---|---|---|---|
alignas |
アラインメント指定 | 4.8 | 3.0 | 7.1あるいはそれ以前からある__declspec(align( x )) 構文で代替可能。 |
|
alignof |
アラインメント取得 | 4.5 | 3.3 | 7.1あるいはそれ以前よりある__alignof で代替可能。 |
|
auto |
型推論 | 4.4 | 2.9 | 12.0 | 10.0 |
C99互換のプリプロセッサ | 可変引数マクロ等 | 4.3 | 2.9 | 11.1 | 8.0 (partial) 可変引数のみ _Pragma の代わりに__pragma が存在する。 |
constexpr |
定数式 | 4.6 | 3.1 | 13.0 (partial) | No |
decltype |
式の型を取得 | 4.3 | 2.9 | 13.0 | 10.0 (partial) 11.0 |
関数のdefault/delete 宣言 |
自動定義される特殊関数の制御 | 4.4 | 3.0 | 12.0 | No |
移譲コンストラクタ | コンストラクタから他のコンストラクタに処理を移譲する | 4.7 | 3.0 | No | 11.0のupdate 2012 Nov |
explicit operator T() |
明示的型変換の演算子 | 4.5 | 3.0 | No | 11.0のupdate 2012 Nov |
拡張friend 宣言 |
テンプレートパラメータやtypedef 名をfriend 宣言 |
4.7 | 2.9 | 11.1 (partial) 12.0 |
No |
extern template |
テンプレートのインスタンス化抑止 | 3.3 | 2.9 | 11.1 | 6.0 |
enum の先行宣言 |
4.6 | 3.1 | 11.1 (partial) | 11.0 | |
継承コンストラクタ | 基本クラスのコンストラクタを継承 | 4.8 | 3.3 | No | No |
ラムダ式 | 関数オブジェクトをその場に書く | 4.5 | 3.1 | 12.0 | 10.0 (partial) 11.0 |
ローカルクラスと無名クラスを、テンプレート引数として使用する | 4.5 | 2.9 | 12.0 | 10.0 | |
long long 型 |
long 以上の大きさを持つ整数型 |
4.3 | 2.9 | 11.1 | 7.1 |
inline namespace |
ネストした名前空間に、透過的にアクセスする | 4.4 | 2.9 | No | |
char16_t 、char32_t 型 |
UTF-16とUTF-32の文字型 | 4.4 | 2.9 | 12.1 (Windows: partial) 12.1 (GNU/Linux, OS X) |
No 10.0より同名のtypedefが存在する |
戻り値の型を後置する関数宣言構文 | 以下のような形式での関数宣言auto f(arg_types...) -> return_type |
4.4 | 2.9 | 12.0 | 10.0 |
nullptr |
ヌルポインタを表すポインタリテラル | 4.6 | 2.9 | 11.1 | 10.0 |
Unicode文字列リテラル | uプレフィックスでUTF-16 (char16_t )UプレフィックスでUTF-32 ( char32_t )u8プレフィックスでUTF-8 ( char ) |
4.5 | 3.0 | No | No |
生文字リテラル | 文字列リテラルにRプレフィックスを付けることで、エスケープシーケンスを無視する | 4.5 | 3.0 | No | 11.0のupdate 2012 Nov |
ユーザー定義リテラル | リテラルのサフィックスをユーザー定義する | 4.7 | 3.1 | No | No |
テンプレートの右山括弧 | vector<basic_string>> のように、>> をスペースを空けずに記述可能にする |
4.3 | 2.9 | 11.1 | 8.0 |
右辺値参照とstd::move() |
右辺値によるオーバーロード、およびそれによるリソースの所有権移動 | 4.3 (partial) 4.6 |
2.9 | 12.0 | 10.0 (partial) ムーブコンストラクタと代入演算子の暗黙定義に対応していない。 |
static_assert |
コンパイル時アサート | 4.3 | 2.9 | 11.1 | 10.0 |
enum class |
強い型付けを持つ列挙型 | 4.4 | 2.9 | 11.1 (partial) | 11.0 |
エイリアステンプレート | テンプレートによる型の別名付け | 4.7 | 3.0 | 12.1 | No |
thread_local |
スレッドローカルストレージ | 4.8 | 3.3 | 11.1 (partial) | 10.0__declspec(thread) 属性での部分サポート |
union の制限解除 |
共用体のメンバ変数として、クラスオブジェクトを持つ | 4.6 | 3.0 | No | |
可変引数テンプレート | 4.3 (partial) 4.4 |
2.9 | 12.1 | 11.0のupdate 2012 Nov | |
範囲for文 | 4.6 | 3.0 | 13.0 | 11.0 | |
override とfinal |
メンバ関数のオーバーライド指定、および派生クラスでのオーバーロードを禁止する指定 | 4.7 | 2.9 | No | 8.0 (partial): override のみ。final の代わりにsealedが存在する。ただし両者ともデストラクタには指定できない。 11.0 |
属性構文 | [[attr]] 構文による、クラス、関数、変数の属性指定 |
4.7 | 3.3 | 12.1 | No |
メンバ関数の左辺値/右辺値修飾 | オブジェクトが左辺値/右辺値の場合のみ呼び出し可能であることの指定 | 4.8.1 | 2.9 | No | No |
非静的データメンバの初期化 | メンバ変数を、宣言と同時に初期値指定する | 4.7 | 3.0 | No | |
ブロックスコープなstatic 変数初期化のスレッドセーフ化 |
4.0 | 2.9 | ? | No [link] |
各処理系のC++11実装状況ページ:
- 全体的な対応状況: C++0xCompilerSupport
- GCC: C++0x/C++11 Support in GCC
- Clang: C++98 and C++11 Support in Clang
- ICC : C++11 Features Supported by Intel® C++ Compiler
- VC++: C++11 Features in Visual C++ 11
##C++14/C++1yの実装状況 C++14は、C++11のバグフィックス + マイナーアップデートが予定されているバージョンである。C++1yは、C++17を目指して進められている、C++14の次バージョンである。C++14がまだどこまで含まれるかが決定的ではないため、本記事執筆段階(2013/05/10)では、いくつかのコンパイラはC++1yとして開発を進めている。
言語機能 | 説明 | GCC | Clang | ICC | MSVC |
---|---|---|---|---|---|
2進数リテラル | 2進数を表す0b or 0B プレフィックスを付けた数値リテラルの記述を可能とする |
4.9 | 3.2 | No | No |
通常関数の戻り値型推論 | 関数の戻り値型をauto にすることで、return 文から戻り値の型を推論させる |
4.8(partial) 4.9 |
3.3(partial) | No | No |
一般化されたラムダキャプチャ | キャプチャに代入構文を導入し、一つの変数に複数のキャプチャ方法を指定可能にする | 4.9 | No | No | No |
実行時サイズの配列 | 組み込み配列を、実行時の要素数で構築することを可能にする | 4.9 | 3.3(partial) | No | No |
ジェネリックラムダ | ラムダ式のパラメータをauto にすることで、ジェネリックな関数呼び出し演算子を持つ関数オブジェクトを生成する |
No | No | No | No |
変数テンプレート | 変数定義時のテンプレート指定を可能にする。 | No | No | No | No |
constexpr の制限緩和 |
if 文、switch 文による条件分岐の許可。for 文、while 文、do-while 文によるループの許可。void 戻り値型の許可初期化を伴う変数宣言の許可。 変数書き換えの許可。 |
No | 3.3(partial) | No | No |
宣言時のメンバ初期化を持つ型の集成体初期化を許可 | No | 3.3 | No | No |
GCCとClangでは、-std=c++1yコンパイルオプションを付けることで、これらの機能を使用できる。
各処理系のC++14/C++1y実装状況ページ: