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

Why can I use a function to assign a value to a constant?

本文关键字:常量 赋值 函数 我可以 可以使 为什么      更新时间:2023-10-16

为什么当 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并不意味着"你必须用文字初始化它"。这意味着"初始化后无法更改此值"。

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

请注意 initializationassignment 之间的区别。

const int num = 3; // This is initialization
int toto = 0;
toto = num; // This is assignment