C++ MSVC 2015无法编译constexpr atan
我在我的项目中使用了C++ MSVC 2015无法编译constexpr atan,c++,visual-studio,c++11,C++,Visual Studio,C++11,我在我的项目中使用了Mingw-w64编译器。现在我正在使用MSVC2015编译该项目。下一行给出了一个错误: constexpr double pi = 4*std::atan(1); 错误: error: C2131: expression did not evaluate to a constant 然而,它在mingw中编译时没有任何问题 MSVC在这种情况下是正确的,从 本文档明确要求某些标准库函数为constexpr实现不得将任何标准库函数签名声明为constexpr,明确要求的
Mingw-w64
编译器。现在我正在使用MSVC2015
编译该项目。下一行给出了一个错误:
constexpr double pi = 4*std::atan(1);
错误:
error: C2131: expression did not evaluate to a constant
然而,它在mingw中编译时没有任何问题 MSVC在这种情况下是正确的,从 本文档明确要求某些标准库函数为constexpr实现不得将任何标准库函数签名声明为constexpr,明确要求的除外。 从我强调的最后一句话中可以看出,如果标准没有声明函数
constexpr
,则不允许实现声明函数
现在,标准是否说明atan
是constexpr
?不,从中的签名可以看出:
std::atan()可能是Mingw-w64编译器中的constexpr,而不在MSVC2015实现中。比较Mingw-64附带的头文件中的此函数声明与Visual Studio附带的相同文件。这看起来像是一个gcc错误。Clang和MSV都正确地拒绝了代码,因为C
atan
中的Yola不能用在常量表达式中,而mingw允许。你的意思是C不允许像const double d[(int)(atan(2))]这样的表达式吗;d[0]=1代码>?@Yola我认为C有VLA,所以这是允许的(除了作业)。但可能还有其他一些上下文需要常量表达式,但我想不出任何常量表达式。没有吗?@Yola用一个更好的参考资料修正了答案,谢谢你提出来:)
float atan(float x); // see [library.c]
double atan(double x);