在命名空间中使用 constexpr double

tai*_*Bsu 2 c++ constexpr c++11

我目前正在研究更多 C++11 的东西,并在constexpr. 在我的一本书中,据说您应该将它用于常量,例如 ? 例如以这种方式:

#include <cmath>

// (...)

constexpr double PI = atan(1) * 4;
Run Code Online (Sandbox Code Playgroud)

现在我想把它放在一个自己的命名空间中,例如。MathC

// config.h

#include <cmath>

namespace MathC {
    constexpr double PI = atan(1) * 4;
    // further declarations here
}
Run Code Online (Sandbox Code Playgroud)

...但这里 IntelliSense 说function call must have a constant value in a constant expression

当我声明PI以下方式时,它有效:

static const double PI = atan(1) * 4;
Run Code Online (Sandbox Code Playgroud)

编译器似乎不喜欢constexprstatic const在这里的实际原因是什么?不constexpr应该在这里也有资格,或者这完全与这里的上下文有关并且constexpr不应该在函数之外声明?

谢谢你。

R S*_*ahu 5

编译器似乎不喜欢constexprstatic const在这里的实际原因是什么?

Aconstexpr必须在编译时可评估,static const而不需要。

static const double PI = atan(1) * 4;
Run Code Online (Sandbox Code Playgroud)

只是告诉编译器PI一旦初始化就不能修改,但可以在运行时初始化。