c++ - 在 C++ 中更新 const 变量值
问题描述
我知道我们在 C 中以这种方式更改 const 变量值(通过将其更改为非常量)。
#include<stdio.h>
#include<stdlib.h>
int main()
{
const int var = 10;
int *ptr = &var;
*ptr = 5;
printf("var = %d\n", var);
return 0;
}
C ++中的类似事情(使用指针)给了我一个编译错误
如何更新 C++ 中的 const 变量值?
解决方案
const
通过任何机制(包括抛弃 const-ness)修改值会导致“未定义行为”(UB),这意味着您无法推断程序的行为。允许编译器假设const
值永远不会改变。基于该假设,编译器可能会:
- 将
const
值存储在只读内存页中;尝试通过指针赋值会导致访问冲突。 - 在任何使用的地方内联该
const
值。因为您使用指针,编译器可能还会为该值发出某种存储(最有可能在堆栈上),以便它具有可以指向的内存位置,但修改此值不会导致内联值改变。 - 别的东西,可能包括以上两者。
它执行哪一项取决于选择的优化级别。
分配一个const
值的程序实际上是“胡说八道”并且没有有意义的解释。
请注意,这是 C 和 C++ 中的 UB。您只需要稍微扭转 C++ 编译器的手臂,就可以编译代码(int *ptr = const_cast<int *>(&var);
)。C 标准允许const
在某些情况下隐式丢弃限定符;C++ 标准对此更加严格。
大多数 C 编译器都会发出int *ptr = &var;
关于丢弃const
限定符的警告。我强烈建议在编译时启用所有警告并将其转换为错误(-Wall -Werror
在 gcc 上)。这将导致 C 编译器也拒绝编译此代码。
请注意,当未声明值时,const
放弃指针(或引用)并分配给目标不是const
UB :
// non-const value
int x = 10;
// take a pointer to x and store it in a pointer-to-const
const int *y = &x;
// cast away the const-ness of the pointer target
int *z = const_cast<int *>(y);
// this is fine; z points at x which is not const
*z = 5;
但是,如果您发现自己需要,const_cast
那么很可能您要么(1)进行一些疯狂的模板元编程,要么(2)错误地解决问题。
推荐阅读
- android - 在单独的线程上执行 Runnable 的多个实例会使我的应用程序崩溃而没有日志
- python - 将包 punkt 下载到 /Users/macbook/nltk_data... 冻结
- php - 如果数据不退出,firstOrFail() 不工作
- android - 我现在应该使用什么方法,因为 FirebaseInstanceId.getInstance().getToken() 已被弃用
- python - Python - 一些键“丢失”的扁平字典
- python - 访问与每个元素关联的计数
- angular - 如何使用 ngFor 让手风琴在 Angular 中循环多次
- ruby - 在构建 zip 文件时,如何调整 RubyZip 示例以使用 File.write_buffer 而不是 File.open?
- java - 即使发送了属性,JSP 代码仍显示 null
- java - 将 .indexOf() 与 ArrayList 一起使用