为什么我可以使用函数为常量赋值?

时间:2014-12-04 14:06:12

标签: c++ const

为什么在PI是常量并且在编译时确定时,C ++中允许使用以下代码,而4 * atan(1)仅在运行时确定。

int main(){
    const double PI = 4*atan(1);
    std::cout << PI << std::endl;
    return 0; 
}

我哪里弄错了?

5 个答案:

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

只是为了扩展大部分答案。

请注意initializationassignment之间的差异。

const int num = 3; // This is initialization

int toto = 0;
toto = num; // This is assignment