C++11 constexpr 导致编译器的内部错误 (C1001)
C++11 constexpr causes compiler's internal error (C1001)
我使用的是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/
编辑:我也不相信改变优化设置会有什么不同,就像其他帖子中建议的那样。到目前为止,我已经尝试过这些设置并应用了推荐的补丁程序,但没有成功。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- 致命错误 C1001:编译器中发生内部错误。'f:\dd\VCtools\Compiler\cxFE\SL\P1\C\P0io.c'
- C1001反量时间的错误(无优化)
- "endl"导致"C1001"错误
- C1001:编译器中包含 <boost/shared_ptr.hpp 时发生内部错误>
- 错误 C1001:编译器中发生内部错误
- 为什么使用openmp时会间歇性出现“致命错误C1001”错误
- 致命错误C1001:编译器中发生内部错误
- C++致命错误 C1001:编译器中发生内部错误
- 错误 C1001:调试模式下的编译器中发生内部错误
- 致命错误 C1001:尝试使用模板时出现内部错误
- 我的card类不断出现编译器错误c1001
- 致命错误 C1001:内部编译器错误(编译器文件"MSC1.cpp",第 1794 行)
- 使用std::map在类头中使用c++模板化属性-编译错误C1001
- Visual Studio 2015致命错误C1001
- c++致命错误C1001使用可变模板
- C++11 constexpr 导致编译器的内部错误 (C1001)