Skip to content

Latest commit

 

History

History
94 lines (75 loc) · 9.07 KB

implementation-status.md

File metadata and controls

94 lines (75 loc) · 9.07 KB

#コンパイラの実装状況 このページでは、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_tchar32_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
overridefinal メンバ関数のオーバーライド指定、および派生クラスでのオーバーロードを禁止する指定 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++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実装状況ページ: