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 附带的MSVC 在这种情况下是对的,来自[constexpr.functions]p1
本文档明确要求某些标准库函数是 constexpr。 除非明确要求,否则实现不应将任何标准库函数签名声明为 constexpr。
从我强调的最后一句话可以看出,如果标准没有这样规定,则不允许实现声明函数constexpr
。
现在标准是否说atan
是constexpr
?不,从[c.math]中的签名可以看出:
float atan(float x); // see [library.c] double atan(double x);
【讨论】:
@Yola In Catan
不能用于常量表达式,而 mingw 允许。
你的意思是C不允许像const double d[(int)(atan(2))]; d[0] = 1.;
这样的表达式吗?
@Yola 我认为 C 有 VLA,所以这是允许的(分配除外)。但是可能还有其他一些需要常量表达式的上下文,但我想不出。没有吗?
@Yola 用更好的参考修正了答案,感谢您提出这个问题:)以上是关于MSVC 2015 无法编译 constexpr atan的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 constexpr 引用生成的汇编代码与 constexpr 指针不同?