C++11 constexpr вызывает внутреннюю ошибку компилятора (C1001)
Я использую Visual Studio 2015 Обновление 3.
Я получаю фатальную ошибку:
(код C1001): в компиляторе произошла внутренняя ошибка.
Вот код:
template<typename T>
constexpr T epsilon = std::numeric_limits<T>::epsilon();
Я прочитал, что это было исправлено в Visual Studio Update 2. Может кто-нибудь объяснить мне, почему я получаю эту ошибку? Заранее спасибо.
2 ответа
Любая внутренняя ошибка (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 с обновлением 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 для x86
Я назвал это ошибкой в Microsoft, но с начала 2017 года они исправили ошибку, которая не была выпущена из того, что я вижу на сегодняшний день.
Я также предоставил проект на GitLab и предоставил Microsoft информацию для этого проекта здесь: https://gitlab.com/cppocl/tostring
Загрузка.sln и компиляция в настоящее время приводит к сбоям в Visual Studio 2015 с обновлением 2 или 3 и Visual Studio Enterprise 2017 версии 15.3.1.
Кажется, что сочетание шаблона и constexpr приводит к сбою компилятора.
Я видел отчеты для Visual Studio 2017, описывающие подобные типы проблем.
Эта ссылка говорит об исправлении в ожидании выпуска: https://developercommunity.visualstudio.com/content/problem/18155/msvc-2017-c-fatal-error-c1001-constexpr-initializa.html
Визуальный список ошибок, связанных с constexpr, в Visual Studio 2015 находится здесь: https://blogs.msdn.microsoft.com/vcblog/2015/12/02/constexpr-in-vs2015-update-1/
РЕДАКТИРОВАТЬ: Я также не верю, что изменение настроек оптимизации будет иметь значение, как это было рекомендовано в других сообщениях. Я экспериментировал с этими настройками и безуспешно применял рекомендуемые патчи.