【问题标题】:C++11 constexpr causes compiler's internal error (C1001)C++11 constexpr 导致编译器的内部错误 (C1001)
【发布时间】:2016-12-06 08:56:19
【问题描述】:

我正在使用 Visual Studio 2015 Update 3。

我收到一个致命错误:

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

代码如下:

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

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

【问题讨论】:

  • 这里出现了很多很多问题:什么错误?为什么要使用模板来进行明显的函数调用,是否包含限制?
  • 我不确定是否有 解释。至少从语言的角度来看,这看起来不错。如果这只是一个内部编译器错误,那么那些没有有用的解释......除非你是编译器作者。因此,只需将 ICE 报告给编译器编写者。
  • 仅供参考,模板变量是 C++14,而不是 C++11。
  • 你也可以试试更新 5 吗?也许其他人已经找到了它,并且在此期间它得到了修复..
  • 因为存在内部错误。一个错误。您还需要了解什么?

标签: c++ visual-c++ visual-studio-2015 c++14 internal-compiler-error


【解决方案1】:

任何内部错误 (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

【讨论】:

    【解决方案2】:

    我已将此问题作为一个错误向 Microsoft 提出,但他们自 2017 年初以来已经修复了该问题,而我今天看到的内容尚未发布。

    我还在 GitLab 上提供了一个项目,并在此处向 Microsoft 提供了该项目的信息:https://gitlab.com/cppocl/tostring

    加载 .sln 和编译当前在 Visual Studio 2015 更新 2 或 3 以及 Visual Studio Enterprise 2017 版本 15.3.1 中崩溃。

    template 和 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/

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多