C ++ 11 constexpr вызывает внутреннюю ошибку компилятора (C1001)

Я использую Visual Studio 2015 Обновление 3.

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

(код C1001): в компиляторе произошла внутренняя ошибка.

Вот код:

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

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

4

Решение

Любая внутренняя ошибка (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'

Версия компилятора:

> кл / нолого- 2>&1 | найти "++"
Оптимизирующий компилятор Microsoft (R) C / C ++ версии 19.00.23725 для x86
6

Другие решения

Я назвал это ошибкой в ​​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/

РЕДАКТИРОВАТЬ:
Я также не верю, что изменение настроек оптимизации будет иметь значение, как было рекомендовано в других постах.
Я экспериментировал с этими настройками и безуспешно применял рекомендуемые патчи.

1

По вопросам рекламы [email protected]