C++11 constexpr 导致编译器的内部错误 (C1001)

C++11 constexpr causes compiler's internal error (C1001)

本文关键字:错误 C1001 内部 constexpr 编译器 C++11      更新时间:2023-10-16

我使用的是Visual Studio 2015 Update 3。

我得到一个致命的错误:

(代码C1001):编译器中发生内部错误。

这是代码:

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

我读到它在Visual Studio更新2中得到了修复。有人能解释一下我为什么会犯这个错误吗?提前谢谢。

任何内部错误(ICE)都是编译器错误。你得到它是因为你碰巧触发了那个bug。对于此编译器,您可以在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>amp;1|查找"++"适用于x86的Microsoft(R)C/C++优化编译器19.00.23725版

我已经向微软提出了这个bug,但他们自2017年初以来就进行了修复,截至今天,我还没有发布。

我还在GitLab上提供了一个项目,并在这里向微软提供了该项目的信息: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

Visual Studio 2015中与constexpr相关的Bug积压工作如下:https://blogs.msdn.microsoft.com/vcblog/2015/12/02/constexpr-in-vs2015-update-1/

编辑:我也不相信改变优化设置会有什么不同,就像其他帖子中建议的那样。到目前为止,我已经尝试过这些设置并应用了推荐的补丁程序,但没有成功。