3

我正在使用 Visual Studio 2015 更新 3。

我收到一个致命错误:

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

这是代码:

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

我读到它已在 Visual Studio Update 2 中修复。有人可以解释我为什么会收到此错误吗?提前致谢。

4

2 回答 2

8

任何内部错误 (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 for x86
于 2016-08-01T10:15:26.423 回答
1

我已将此作为 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

Visual Studio 2015 积压的与 constexpr 相关的错误在这里: https ://blogs.msdn.microsoft.com/vcblog/2015/12/02/constexpr-in-vs2015-update-1/

编辑:我也不相信更改优化设置会产生任何影响,正如其他帖子中所建议的那样。到目前为止,我已经尝试过这些设置并应用了推荐的补丁,但没有成功。

于 2018-06-12T07:53:50.213 回答