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