我知道我们在 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;
}
Run Code Online (Sandbox Code Playgroud)
C++ 中的类似事情(使用指针)给了我一个编译错误
如何更新 C++ 中的 const 变量值?
const通过任何机制(包括抛弃常量)修改值会导致“未定义行为”(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指针(或引用)并分配给目标不是UB const:
// 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;
Run Code Online (Sandbox Code Playgroud)
但是,如果您发现自己需要,const_cast那么很可能您要么 (1) 进行了一些疯狂的模板元编程,要么 (2) 错误地解决了问题。