首页 > 解决方案 > 在 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 变量值?

标签: c++constants

解决方案


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放弃指针(或引用)并分配给目标不是constUB :

// 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)错误地解决问题。


推荐阅读