我已经编写了一个c ++程序作为打击:
#include <iostream>
int main()
{
constexpr double a = 4.0;
constexpr double b = sqrt(a);
std::cout << b << std::endl;
return 0;
}
当我尝试使用Visual Studio 2017编译此代码时,出现一个错误,指出函数调用必须在常量表达式中具有常量值。坏行是“ constexpr double b = sqrt(a);”。
但是当我使用g ++编译相同的代码时,未报告任何错误。
错误原因是什么? g ++和vc ++有什么区别?
答案 0 :(得分:3)
sqrt
不是constexpr
函数,因此不能在constexpr
表达式中使用。 GCC似乎有sqrt
的特殊内置版本,即constexpr
。 Clang也不允许此代码:
答案 1 :(得分:1)
sqrt
不是常量表达式,因此constexpr double b = sqrt(a);
不起作用。 Clang does not build this code as well。您还需要包括<cmath>
标头才能使用此功能。
答案 2 :(得分:-1)
include cmath library since you using a sqrt() function
答案 3 :(得分:-3)
您可以在VS中使用const而不是constexpr。 不知道真正的错误是什么。
将某些内容声明为constexpr并不一定保证它将在编译时进行评估。它可以用于此目的,但也可以在运行时评估的其他地方使用。