2

Я использую Visual Studio 2015 Update 3.C++ 11 constexpr вызывает внутренняя ошибка компилятора (C1001)

Я получаю фатальную ошибку:

(code C1001) : An internal error has occurred in the compiler.

Вот код:

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

Я читал, что он был исправлен в Visual Studio Update 2. Может ли кто-нибудь объяснить мне, почему я получаю эту ошибку? Заранее спасибо.

+0

Здесь возникает много, много вопросов: какая ошибка? Почему вы используете шаблон для того, что явно является вызовом функции, вы включили лимиты? – Zafi

+0

Я не уверен, что есть объяснение. По крайней мере, не с точки зрения языка, где это выглядит нормально. Если это всего лишь внутренняя ошибка компилятора, у них нет полезных объяснений ... если вы не являетесь автором компилятора. Итак, ICE просто нужно сообщить разработчику компилятора. –

+1

Просто FYI, переменными шаблона являются C++ 14, а не C++ 11. – HolyBlackCat

ответ

6

Любая внутренняя ошибка (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 
Смежные вопросы