Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC 2015无法编译constexpr atan_C++_Visual Studio_C++11 - Fatal编程技术网

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);