Любая внутренняя ошибка (ICE) является ошибкой компилятора. Вы получаете его, потому что вам удалось вызвать эту ошибку. Для этого компилятора вы можете сообщить об этом в Microsoft Connect.
Для такого отчета вам нужен пример с ожидаемым правильным результатом и ошибочным результатом.
Следующая тестовая программа компилируется & работает хорошо с MinGW г ++ 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 обновления 2 он производит ICE:
foo.cpp(10): fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\symbols.c', line 28114)
To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
foo.cpp(10): note: see reference to variable template 'const double epsilon' being compiled
Версия компилятора:
> cl /nologo- 2>&1 | find "++"
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23725 for x86
Здесь возникает много, много вопросов: какая ошибка? Почему вы используете шаблон для того, что явно является вызовом функции, вы включили лимиты? – Zafi
Я не уверен, что есть объяснение. По крайней мере, не с точки зрения языка, где это выглядит нормально. Если это всего лишь внутренняя ошибка компилятора, у них нет полезных объяснений ... если вы не являетесь автором компилятора. Итак, ICE просто нужно сообщить разработчику компилятора. –
Просто FYI, переменными шаблона являются C++ 14, а не C++ 11. – HolyBlackCat