3

Visual Studio 2015 Update 3 を使用しています。

致命的なエラーが発生します:

(コード C1001) : コンパイラで内部エラーが発生しました。

コードは次のとおりです。

template<typename T>
constexpr T epsilon = std::numeric_limits<T>::epsilon();

Visual Studio Update 2 で修正されたと読みました。なぜこのエラーが発生するのか説明してもらえますか? 前もって感謝します。

4

2 に答える 2

8

内部エラー (ICE) はコンパイラのバグです。たまたまそのバグを引き起こしたので、あなたはそれを手に入れました。このコンパイラについては、Microsoft Connect で報告できます。

このようなレポートでは、予想される正しい結果と誤った結果の例が必要です。

次のテスト プログラムは、MinGW g++ 5.1 で適切にコンパイルおよび実行されます。

#include <limits>

template<typename T>
constexpr T epsilon = std::numeric_limits<T>::epsilon();

#include <iostream>
using namespace std;
auto main() -> int
{
    cout << epsilon<double> << endl;
}

出力:

2.22045e-016

Visual C++ 2015 update 2 では、ICE が生成されます。

foo.cpp(10): 致命的なエラー C1001: コンパイラで内部エラーが発生しました。
(コンパイラ ファイル 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\symbols.c'、28114 行目)
 この問題を回避するには、上記の場所の近くでプログラムを単純化または変更してみてください。
Visual C++ でテクニカル サポート コマンドを選択してください。
 詳細については、[ヘルプ] メニューを参照するか、テクニカル サポートのヘルプ ファイルを開いてください。
foo.cpp(10): 注: コンパイル中の変数テンプレート 'const double epsilon' への参照を参照してください

コンパイラのバージョン:

> cl /nologo- 2>&1 | 「++」を見つける
Microsoft (R) C/C++ 最適化コンパイラ バージョン 19.00.23725 for x86
于 2016-08-01T10:15:26.423 に答える