为什么当 PI 是一个常量并在编译时确定而 4*atan(1) 仅在运行时确定时,C++中允许使用以下代码。
int main(){
const double PI = 4*atan(1);
std::cout << PI << std::endl;
return 0;
}
我哪里弄错了?
您可以使用 not- constexpr
函数来初始化该常量,因为它不是编译时常量,而只是一个const
限定变量。
不幸的是,大多数math.h
函数都无法constexpr
,因为它们可以设置errno
。
大肠杆菌上的错误:http://coliru.stacked-crooked.com/a/07a87519a0cdab07
这是一个初始化,而不是赋值。您没有更改常量的值,只是将其初始化为某个值。这是正确的,并且不违反const
表示的恒定性。
这里的const
并不意味着"这个局部变量的值在编译时是已知的"。这意味着"这个局部变量的值不会改变"。
能够在编译时计算4*atan(1)
。对于atan
和所有其他constexpr
函数都是如此。
您也可以通过将值声明为constexpr
来强制执行此操作:
constexpr double PI = 4*atan(1);
std::cout << PI << std::endl;
const
并不意味着"你必须用文字初始化它"。这意味着"初始化后无法更改此值"。
只是为了扩展大部分答案。
请注意 initialization
和 assignment
之间的区别。
const int num = 3; // This is initialization
int toto = 0;
toto = num; // This is assignment