8

この例std::initializer_listの男のように、Visual Studio 2012 で sを使用したいと考えています。私のオペレーティング システムは Windows 8 x64 です。

そのため、最近Visual C++ Compiler 2012 年 11 月 CTPをインストールし、Microsoft が言及したように、プロジェクトのプラットフォーム ツールセットを変更して、その新しく更新されたコンパイラを使用しました。

しかし、そうしてstd::initializer_listも、<initializer_list>ヘッダーもヘッダーもありません。しかし、リンクされた Microsoft の Web サイトでは、(「概要」という見出しの下に) 初期化子リストがその更新で利用可能になることが示されています。IDE と PC の両方を再起動しました。(悲しいことに) Visual Studio のドイツ語版を使用しており、コンパイラの更新プログラムが英語であるという事実が原因である可能性があるかどうかはわかりません。私は何を間違っていますか?

更新: auto a = { 0 };IntelliSense によって批判されている行をコンパイルしようとすると、コンパイラの出力が表示さ'Microsoft Visual C++ Compiler Nov 2012 CTP' is for testing purposes only.れ、コンパイラがクラッシュし、エラー ウィンドウが表示されますMicrosoft (R) C/C++ Compiler Driver has stopped working。新しい構文がなくても、すべてがコンパイルされ、選択された新しいコンパイラで正常に動作します。

4

2 に答える 2

25

(私は Microsoft および Dinkumware と協力して、VC の標準ライブラリの実装を維持しています。)

【ダニジャール】

(悲しいことに) Visual Studio のドイツ語版を使用しており、コンパイラの更新プログラムが英語であるという事実が原因である可能性があるかどうかはわかりません。

残念ながら、英語のみの CTP はドイツ語の VS をサポートしていません。

「コンパイラ ドライバ」cl.exe は、コンパイラ フロントエンド c1xx.dll、コンパイラ バックエンド c2.dll、およびリンカー link.exe を呼び出すものです。コンパイラ ドライバがクラッシュすることは非常にまれです。CTP によって追加されたエラー メッセージの 1 つを表示しようとしていると推測しますが、CTP はドイツ語のリソースを更新しなかったため、コンパイラ ドライバーはエラー メッセージを読み込めず、クラッシュに進みます。

これは、フロントエンドまたはバックエンドの内部コンパイラ エラー、またはたまたま誤って出力される通常のコンパイラ エラーとは異なることに注意してください。(CTP がリリースされた後、多くの ICE と偽のエラーが修正されました。)

しかし、そうした後でも、 std::initializer_list も <initializer_list> ヘッダーも利用できません。

CTP は <initializer_list> を特別な場所にインストールしました。(実際には、コンパイラ チームによって作成されました。)

コマンド ラインでは、CTP を使用してインクルード パスに <initializer_list> を配置するための呪文は次のとおりです (デフォルトの場所を想定)。

"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86
set PATH=C:\Program Files (x86)\Microsoft Visual C++ Compiler Nov 2012 CTP\bin;%PATH%
set INCLUDE=C:\Program Files (x86)\Microsoft Visual C++ Compiler Nov 2012 CTP\include;%INCLUDE%

行 auto a = { 0 }; をコンパイルしようとしています。これはIntelliSenseによって批判されています

これは文書化されています - Intellisense は CTP によって更新されていないため、新しい機能は認識されません。

[ルーベンブ]

C++ 標準ライブラリはコンパイラで更新されていないため、まともな <tuple> と <intializer_list> がありません (これには、すべての標準コンテナーの波括弧付きの初期化リスト コンストラクターの省略が含まれます)。

スコープ付き列挙型と初期化子リストを完全にサポートするように標準ライブラリを更新したことに興味があるかもしれません。これには、現在のワーキング ペーパー (N3485) で義務付けられているすべての initializer_list オーバーロードに加えて、他のすべての標準ヘッダーと共に <initializer_list> を通常の場所にインストールすることが含まれます。(これは Dinkumware の公式コピーでもありますが、コンパイラ チームの「偽の」バージョンとの違いはほとんど表面的なものでした。) このようなものは、次のパブリック リリースで、いつでも、どのようなものでも利用できるようになります。次のタスクは、脆弱なシミュレーションを置き換えて、標準ライブラリを明示的な変換演算子と可変個引数テンプレートで更新することです。

于 2013-01-28T22:01:21.807 に答える
3

お気づきのとおり、11月のCTPは、少なくとも2つの理由により、使いやすさが非常に制限されています。

  1. コンパイラには、発見したバグなど、クラッシュの原因となるバグが多数あります。

  2. C ++標準ライブラリはコンパイラで更新されなかったため、まともな<tuple>ものがなくなりました(これには、すべての標準コンテナ<intializer_list>のブレース付きinitリストコンストラクタの省略が含まれます)

また、リンクされた例は非常に醜いコードです。この機能を使用する場合は、この構文をサポートするGCCやClangなどのコンパイラを使用してください。どちらもWindowsで利用できます。余分なコードを書くことによって、半分実装された言語機能をハッキングするのはばかげています。

于 2013-01-28T18:21:53.767 に答える