C++11 の機能 (Modern C++)

このドキュメントでは、Visual C++ で実行される C++11 と呼ばれる新しい C++ 標準またはの機能をとして示します。

C++11 コア言語機能

Visual C++ 2010 は前駆 C++11物質が見つかり、Visual Studio 2012 の Visual C++ には、多くの C++11 機能を含むように配置します C++0x のコア言語仕様の多くの機能を実装します。次の表は Visual C++ 2010 と Visual Studio 2012 の Visual C++両方の C++11 コア言語機能と実装の状態を示します。

C++11 コア言語機能

VC10

VC11

rvalue 参照 v0.1v1.0v2.0v2.1v3.0

v2.0

v2.1*

ref 修飾子

非静的データ メンバーの初期化子

テンプレート v0.9、Variadic v1.0

初期化子リスト

static_assert

auto v0.9v1.0

v1.0

v1.0

後続の戻り値の型

ラムダ v0.9v1.0v1.1

v1.0

v1.1

decltype v1.0v1.1

v1.0

**]

右山かっこ

関数テンプレートの既定のテンプレート引数

式 SFINAE

エイリアスのテンプレート

extern テンプレート

です。

厳密に型指定された列挙型

Partial

継続は、列挙型を宣言しました

属性

constexpr

配置

TR1

Partial

デリゲートのコンストラクター

コンストラクターの継承

明示的な変換演算子

char16_t

Unicode のリテラル文字列

生のリテラル文字列

リテラルのユニバーサル文字名

ユーザー定義のリテラル

標準レイアウトと単純型

既定の怠られ、削除された関数

フレンド拡張申告

拡張

インライン名前空間

無制限の共用体

テンプレート引数としてローカル、名前のない型

ベースの for ループ スコープ

オーバーライドと、v0.9最終的 v0.8v1.0

Partial

最小限の追加のサポート

noexcept

C++11 コア言語機能: 同時実行

VC10

VC11

繰り返されたシーケンス ポイント

N/A

N/A

アトミック

厳密な比較し、交換します。

双方向フェンス

メモリ モデル

N/A

N/A

データ依存関係の順序

データ依存関係の順序付け: 関数のコメント

exception_ptr

quick_exit

通知ハンドラーの分割

スレッド ローカル ストレージ

Partial

Partial

の静的魔法

C++11 コア言語機能: C99

VC10

VC11

__func

Partial

Partial

プリプロセッサ C99

Partial

Partial

long。

長整数の型

N/A

N/A

テーブルの情報にすばやくガイドを次に示します。

Hh567368.collapse_all(ja-jp,VS.110).gifrvalue 参照

クラスの初期化 N1610 "ついて rvalue によってオブジェクトが" は rvalue 参照しないで移動セマンティクスを有効にする前の試行はありません。ここでは、これを "rvalue 参照 v0.1 呼び出すします"。はこれが "rvalue 参照 v1.0に置き換えられました"。Visual C++ 2010 の作業に基づいてとおりである "右辺値からバインディング左辺値に" は v2.0、rvalue 参照を禁止します。これにより、主要なセキュリティ問題を修正参照します。"rvalue 参照は v2.1 "この規則を定義します。vector<string>::push_back()、オーバーロード push_back(const string&) と push_back(string&&)場合は v.push_back("strval")使用を検討してください。"strval" 式はリテラル文字列であり、値です。他のリテラル (たとえば、整数 1729 は、rvalue ですが、配列であるため、リテラル文字列は特殊です)。rvalue 参照 v2.0 の規則はどのようなコメントが残されたため、"strval" が左辺値であり、push_back(const string&) が実行できる唯一のオーバーロードであるため string&& は "strval" にバインドすることはできません。これは一時的な std::stringを作成し、ベクターにコピーし、一時的な std::stringを破棄します。これは、非常に有効ではありません。rvalue 参照 v2.1 の規則は string&& を "strval" にバインドして一時的な std::stringを作成すると、一時的 rvalue がであることを確認します。したがって、push_back(const string&) と push_back(string&&) は、実行可能であり、push_back(string&&) はください。一時 std::string、ベクターにされ、実行されます。これは効率的です。

"参照 v3.0" 右辺値は自動的に移動コンストラクターを生成し、代入演算子を、特定の条件下で実行する新しい規則を追加します。ただし、これは時間とリソースの制約による Visual Studio 2012 の Visual C++では実装されません。

Caution メモ注意

v0.1 は、v1.0、v2.0、v2.1 v3.0 の指定 C++11.の進化を示すために、わかりやすくするために作成されます。

Hh567368.collapse_all(ja-jp,VS.110).gifLambdas

ラムダ関数 が作業用紙 (バージョン 0.9) にポーリングされた後、変更可能なラムダ (バージョン 1.0) が追加されましたが、標準化委員会が言葉遣い分解を確認します。これは、ラムダ バージョン 1.1が生成されました。これは Visual C++ 2010に組み込まれるには大きすぎる遅延が発生 Visual Studio 2012 の Visual C++にあります。ラムダ v1.1 の言葉遣いは静的メンバーまたは入れ子になったラムダを示すことが望ましいときの動作は、角度のケースに明確にします。これは、複雑なラムダによってトリガーされたバグを修正します。また Visual Studio 2012 の Visual C++に、ステートレスのラムダ関数はに変換可能ポインターです。これは N2927 言葉遣いではなく、ラムダ v1.1 の一部としてそのままカウントされます。FDIS 5.1.2]/[expr.prim.lambda 6 この説明を含んでいます: "ラムダのないキャプチャ ラムダ式のクロージャの型にクロージャの型の関数呼び出し演算子と同じパラメーターと戻り値の型を持つ関数へのポインターにパブリック非仮想の非 const の明示的な変換の関数があります。この変換関数によって返される値は、関数のアドレスで呼び出された場合に、発生、開始することと同じですクロージャの型の関数呼び出し演算子を"。(Visual Studio 2012 の Visual C++ は、任意の呼び出し規約がある機能するためにステートレス ラムダをポインターに変換可能で作成したので、それより優先されます。これは __stdcall の関数ポインターなどを受け取る API を使用しているときに重要です)。

Hh567368.collapse_all(ja-jp,VS.110).gifdecltype

decltype は、用紙作業 (バージョン 1.0) にポーリングすると、より重要なバグ修正の直前の分で受信した (バージョン 1.1)。これは、STL と Boost を行うプログラマに大きな対象としています。

Hh567368.collapse_all(ja-jp,VS.110).gif厳密に型指定されたを続行または列挙型を宣言しました

厳密に型指定された列挙型 部分的に Visual C++ 2010 (具体的には、明示的に指定された基になる型の一部) でがサポートされていました。Visual Studio 2012 の Visual C++ は完全に実装し、また十分に C++11 セマンティクスを 転送が、列挙体を宣言しました実装します。

Hh567368.collapse_all(ja-jp,VS.110).gif[配置]

Visual C++ 2010、または、Visual Studio 2012 の Visual C++ の実装作業にポーリングする用紙の 配置の提案 コアの言語キーワード alignas/alignof。Visual C++ 2010 に TR1 の aligned_storage がありました。Visual Studio 2012 の Visual C++ は、標準ライブラリに aligned_union と std::align() を追加します。

Hh567368.collapse_all(ja-jp,VS.110).gif標準レイアウトと単純型

公開された変更はから N2342 "もう一度使用される POD; 解決できる問題コア 568 (5) を" 変更<type_traits>へ is_trivial と is_standard_layout の追加です。(N2342 は多くのコア言語の言葉遣いを改めましたが、コンパイラの変更は必要ではありません。これらの型の特徴は Visual C++ 2010に置かれていましたが、is_podをレプリケート。したがって、このドキュメントの表は、前に "いいえ" を言いませんサポートされていません。Visual Studio 2012 の Visual C++では正確な応答を提供する、解像度に依存しないコンパイラ フックです。

Hh567368.collapse_all(ja-jp,VS.110).gifオーバーライドと最終

これは短く複雑な進化して行きました。もともと、version 0.8 では、[[override]]、[[hiding]]、および [[base_check]] 属性があります。次に、バージョン 0.9属性はコンテキスト キーワードと削除され、置き換えられました。最後に バージョン 1.0、クラスのfinal ""、および "" overrideと関数の "" finalに減っています。これは Visual C++ 2010 が既に関数の "" のoverrideこの構文をサポートし、C++11.でそれらの近くのセマンティクスが妥当であったために発生した拡張子を返します。"finalは"、がサポートされていましたが、別のスペルの下に "シールされています"。Visual Studio 2012では、override "" および "" finalの標準のスペルとセマンティクスは完全にサポートされます。詳細については、「override 指定子」および「final 指定子」を参照してください。

Hh567368.collapse_all(ja-jp,VS.110).gifは、多く

アトミック厳密な比較し、交換します。双方向フェンスデータ依存関係の順序Visual Studio 2012 の Visual C++で実行される標準ライブラリのコンピューターなどを指定します。

Hh567368.collapse_all(ja-jp,VS.110).gif標準ライブラリの機能

そのコア言語について説明します。C++11 標準ライブラリについては、が機能の明確なテーブルはありませんが、Visual Studio 2012 の Visual C++ は、2 種類の例外を除き、を実装します。最初にライブラリの機能がコンパイラに不足している機能に依存する場合は、いずれかの例は、要求の make_shared<T>()の variadic テンプレートをシミュレートするシミュレートします。または、は、そこは、いくつかのケースのみ、特に、<initializer_list>実行されません。第 2 に、C++11 標準ライブラリに参照によって組み込まれる C99 標準ライブラリは、<stdint.h> が Visual C++ 2010に実行されたが、主に実装されていないです。Visual Studio 2012 の Visual C++の変更部分の一覧を次に示します。:

新しいヘッダー:<atomic><chrono><condition_variable><future><mutex><ratio><scoped_allocator><thread>

C++11、emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() に 必要な、布置: は、"オプション" 回数実行されます ( "のど variadics" セクションのすべてのコンテナーを参照)。たとえば、vector<T> には "template <typename... Args> void emplace_back(Args&&... args)" があり、これは任意の数の任意の引数の後ろで直接 T 型の要素を構築し、完璧にフォーワードされます。これは、その移動構築と破棄を含む push_back(T&&)よりもあります。

のどの variadics:Visual Studio 2012 の Visual C++ に variadic テンプレートをモデル化するための新しい設定があります。Visual C++ 2008 SP1 と Visual C++ 2010では、subheaders 0 は異なる方法で定義されるたびに、マクロと繰り返し 1、2、3 回以上のオーバーロードを押すように、含まれていました。たとえば、<memory> は make_shared<T>(args, args, args)を押すように内部 subheader <xxshared> を繰り返し含まれていました。Visual Studio 2012 の Visual C++では、subheaders はなくなります。これで variadic テンプレートは、マクロと (バックスラッシュ継続の多くに) 定義され、マスター マクロを使用して配置されます。この内部実装の変更は、これらの動作をします:

  • コードの管理する、簡単に使用できます (subheaders を追加すると、の作業量のものです)、および読みやすく。

  • デバッガーはのとにステップ インすることは困難です。

  • std::pair の pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) のコンストラクターは、"" の間の効果を説明しました。これは N^2 オーバーロードが必要です (空のタプルが、ここでないため、これは、10) までその場合、121 のオーバーロードを過度に意味します)。

布置すべてのオーバーロードとは多くのペア タプルのオーバーロードを、無バーに送信して、コンパイル中にメモリの莫大な量が実行されました。したがって、は、無限を減らしました。Visual C++ 2008 SP1 と Visual C++ 2010では、無限大は 10 です (つまり、"" variadic ボックス テンプレートは 0 から 10 レベルの引数、包括サポートしていました)。既定では、Visual Studio 2012 の Visual C++の無限大は 5 です。これは、Visual C++ 2010にいたポリシーにコンパイラのメモリ使用量を返します。より多くの引数を 6 組を使用する既存のコードがある場合は、(たとえば) 必要な場合は、エスケープ ハッチがあります。包括 5 から 10 までのプロジェクト全体の _VARIADIC_MAX を定義できます。これはメモリを実行し、プリコンパイル済みヘッダーにより多くのスペースを確保する /Zm のコンパイラ オプションを使用する必要があります。

無作為性:uniform_int_distribution は、完全に公平です shuffle() は <algorithm>に実装されますが、直接 mersenne_twisterなどの統一された乱数ジェネレーターを受け入れます。

アドレス演算子のオーバーロードに対する抵抗: C++98/03 は、アドレス演算子をオーバーロードから、STL コンテナーの要素を禁止しました。これは、このようなオーバーロードから STL を保護することを CAdapt のようなヘルパー クラスが要求されたようにする並べ替える CComPtr のものです。Visual C++ 2010の開発時に、STL 拒否するように指定できます。また状態のアドレス演算子のオーバーロード変更します。C++11 は、アドレス演算子をオーバーロード使用可能にする条件を変更しました。C++11 と Visual C++ 2010は、演算子のオーバーロードに関係なく、オブジェクトの実際のアドレスを取得できるヘルパー関数 std::addressof()を提供します。Visual C++ 2010 が解放される前に、"" と "" std::addressof(elem)&elemの生成を置き換えるようにしました適切に抵抗力がある。Visual Studio 2012 の Visual C++では、さらにの順に進んでいました。ここで、アドレス演算子、をオーバーロードするクラスは、STL 全体で使用可能になるように、すべてのコンテナーとすべての反復子を監査しています。

Visual Studio 2012 の Visual C++ は、複数の方法で C++11 にとどまりません:

でき、標準説明されている 高速化のジェネリック クラスと小さいプログラム内の依存関係を最小限に抑える "" N2911N2980 "恐い反復子の割り当ておよび初期化のリビジョン 1 "ように C++11 から要求されないように恐い反復子: 恐い反復子は、実装されています。

ファイルシステム: は <filesystem> のヘッダーから 提案 TR2 追加されました。これは recursive_directory_iterator およびそのほかの重要な機能が用意されています。C++0x がきわめて低速であり、実行 C++11 に変更するため TR2 の作業が固定前に、2006 年の推奨事項はから Boost.Filesystem V2派生しています。これは Boost.Filesystem V3 に配置しましたが、Visual Studio 2012 の Visual C++では実装されません。

と主な最適化!現在の表示を持つ、すべてのコンテナーは、最上位に小さい。これは、コンテンツ ポイントにそののへのコンテナー オブジェクト自体は、示します。たとえば、std::vector は、3 種類の生のポインターが格納されます。Visual C++ 2010では、x86 のリリース モード、std::vector は 16 バイトです。Visual Studio 2012 の Visual C++で、最上位に小さい場合は 12 バイトです。これには、プログラムで 100,000 のベクターがある場合へ Visual Studio 2012 の Visual C++ 大きいため、400,000 バイト保存します。の使用は、メモリ空間と時刻の両方を節約できます。

これは空のアロケーターと比較子のストレージを避けることによって std::allocator と std::less は状態非依存であるため、実行されました。(これらの最適化は、カスタム アロケーターと比較子に対して状態非依存である限り、非常に有効になります。当然ながら、stateful アロケーターと比較子のストレージは回避できませんが、きわめてまれです)。

Hh567368.collapse_all(ja-jp,VS.110).gifコンテナーのサイズ

次の表は、x86 および x64 プラットフォームのサイズ (バイト単位) コンテナーのサイズを示します。32 ビット (ARM がこれらの目的の x86 と同じです)。デバッグ モードが領域と時間を実行するコンピューターなどのチェックが含まれているため、これらの表は、のリリース モード。別の列が _SECURE_SCL が 1 に設定 _SECURE_SCL、を使用してそのスケジューラの Visual C++ 2008 SP1 のように手動で最高速度の 0 に設定します Visual C++ 2008 SP1 の場合です。Visual C++ 2010 と Visual Studio 2012 の Visual C++ は 0 に _SECURE_SCL の既定値 (_ITERATOR_DEBUG_LEVELとして知られています)。

x86 のコンテナーのサイズ (バイト)

VC9 SP1

VC9 SP1

SCL=0

VC10

VC11

ベクター<int>

24

16

16

12

配列<int, 5>

20

20

20

20

deque<int>

32

32

24

20

forward_list<int>

N/A

N/A

8

4

リスト<int>

28

12

12

8

priority_queue<int>

28

20

20

16

キュー<int>

32

32

24

20

スタック<int>

32

32

24

20

ペア<int, int>

8

8

8

8

タプル<int, int, int>

16

16

16

12

マップ<int, int>

32

12

16

8

map<int, int>

32

12

16

8

<int>を設定します。

32

12

16

8

多重セット<int>

32

12

16

8

hash_map<int, int>

72

44

44

32

hash_multimap<int, int>

72

44

44

32

hash_set<int>

72

44

44

32

hash_multiset<int>

72

44

44

32

unordered_map<int, int>

72

44

44

32

unordered_multimap<int, int>

72

44

44

32

unordered_set<int>

72

44

44

32

unordered_multiset<int>

72

44

44

32

string

28

28

28

24

wstring

28

28

28

24

x64 コンテナーのサイズ (バイト)

VC9 SP1

VC9 SP1

SCL=0

VC10

VC11

ベクター<int>

48

32

32

24

配列<int, 5>

20

20

20

20

deque<int>

64

64

48

40

forward_list<int>

N/A

N/A

16

8

リスト<int>

56

24

24

16

priority_queue<int>

56

40

40

32

キュー<int>

64

64

48

40

スタック<int>

64

64

48

40

ペア<int, int>

8

8

8

8

タプル<int, int, int>

16

16

16

12

マップ<int, int>

64

24

32

16

map<int, int>

64

24

32

16

<int>を設定します。

64

24

32

16

多重セット<int>

64

24

32

16

hash_map<int, int>

144

88

88

64

hash_multimap<int, int>

144

88

88

64

hash_set<int>

144

88

88

64

hash_multiset<int>

144

88

88

64

unordered_map<int, int>

144

88

88

64

unordered_multimap<int, int>

144

88

88

64

unordered_set<int>

144

88

88

64

unordered_multiset<int>

144

88

88

64

string

40

40

40

32

wstring

40

40

40

32

Visual C++ のバージョン番号に関するクイック リファレンス ガイド

場所によって表示される Visual C++ に異なるバージョン番号 "" があります。決め付けられたバージョン (ボックスで出力される)、内部バージョン (について のダイアログ ボックスに表示されます)、およびコンパイラのバージョンがあります (cl.exe と _MSC_VER のマクロで表示)。

決め付けられたバージョン番号

内部バージョン番号

#define _MSC_VER のバージョン番号

Visual C++ 2005

VC8

1400

Visual C++ 2008

VC9

1500

Visual C++ 2010

VC10

1600

Visual Studio 2012 の Visual C++

VC11

1700

_MSC_VER のマクロは Visual C++ の異なるメジャー バージョンを対象とし、それらの別のコードを出力するユーザーに興味深いです。

参照

関連項目

C++ でのラムダ式

範囲ベースの for ステートメント (C++)

その他の技術情報

C++ へようこそ (Modern C++)

C++ 言語リファレンス

C++ の標準ライブラリの参照

Visual C++ チームのブログ