MSVC 2015 无法编译 constexpr atan

Posted

技术标签:

【中文标题】MSVC 2015 无法编译 constexpr atan【英文标题】:MSVC 2015 cannot compile constexpr atan 【发布时间】:2016-06-21 18:45:12 【问题描述】:

我在我的项目中使用了Mingw-w64 编译器。现在我正在用MSVC2015 编译项目。以下行给出了错误:

constexpr double pi = 4*std::atan(1);

错误:

error: C2131: expression did not evaluate to a constant

但是它在 mingw 中编译没有任何问题。

【问题讨论】:

可能 std::atan() 在 Mingw-w64 编译器中是 constexpr 并且不在 MSVC2015 实现中。比较 Mingw-64 附带的 头文件和 Visual Studio 附带的同一文件中的此函数声明 这看起来像一个 gcc 错误。 Clang 和 MSVS 都正确拒绝代码恕我直言。 【参考方案1】:

MSVC 在这种情况下是对的,来自[constexpr.functions]p1

本文档明确要求某些标准库函数是 constexpr。 除非明确要求,否则实现不应将任何标准库函数签名声明为 constexpr。

从我强调的最后一句话可以看出,如果标准没有这样规定,则不允许实现声明函数constexpr

现在标准是否说atanconstexpr?不,从[c.math]中的签名可以看出:

float atan(float x);  // see [library.c]
double atan(double x);

【讨论】:

@Yola In C atan 不能用于常量表达式,而 mingw 允许。 你的意思是C不允许像const double d[(int)(atan(2))]; d[0] = 1.;这样的表达式吗? @Yola 我认为 C 有 VLA,所以这是允许的(分配除外)。但是可能还有其他一些需要常量表达式的上下文,但我想不出。没有吗? @Yola 用更好的参考修正了答案,感谢您提出这个问题:)

以上是关于MSVC 2015 无法编译 constexpr atan的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 constexpr 引用生成的汇编代码与 constexpr 指针不同?

constexpr 在联合中初始化结构时,msvc visual c++ 静默错误代码生成

constexpr string_view 比较

为啥编译器无法确定构造函数实际上是 constexpr?

msvc2015 编译 Qt 4.8.7 和 4.8.6

使用 msvc 2015 编译的 Windows 桌面应用程序的便携式安装