为什么我可以使用函数为常量赋值
Why can I use a function to assign a value to a constant?
为什么当 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
相关文章:
- 非常量变量只读位置的赋值
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 为什么通过指针赋值常量没有效果?
- 为什么在C++中,内建赋值返回的是非常量引用而不是常量引用
- 为什么类的赋值运算符的返回类型通常是非常量(而不是常量)引用?
- 引用模板类型的赋值运算符需要非常量重载
- 将函数赋值给函数指针,常量参数正确性
- 为什么 GCC 拒绝复制赋值操作中的常量引用
- 为什么常量字符 INITIAL='G' 不是赋值语句?
- 字符常量数组为空,即使已为其赋值 [C++]
- 常量引用向量向量<向量<long>>赋值不编译
- 存在静态常量成员时的赋值运算符
- 在类的构造函数中为常量动态大小的数组赋值
- 重载全常量类型的复制赋值运算符的正确方法是什么?
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 使用常量引用进行赋值
- 为什么不能为非常量引用赋值
- 为什么我可以使用函数为常量赋值
- 编译-vs运行时常量变量赋值和C++中vlas的分配
- C++ : 在左侧常量赋值上添加引用/别名 (&) 是多余的吗?