函数调用在常量表达式中必须具有常量值

时间:2018-09-21 07:07:32

标签: c++ visual-c++

我已经编写了一个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 ++有什么区别?

4 个答案:

答案 0 :(得分:3)

sqrt不是constexpr函数,因此不能在constexpr表达式中使用。 GCC似乎有sqrt的特殊内置版本,即constexpr。 Clang也不允许此代码:

https://godbolt.org/z/SvFEAW

答案 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 

http://www.cplusplus.com/reference/cmath/

答案 3 :(得分:-3)

您可以在VS中使用const而不是constexpr。 不知道真正的错误是什么。

将某些内容声明为constexpr并不一定保证它将在编译时进行评估。它可以用于此目的,但也可以在运行时评估的其他地方使用。