在 C++ 中更新常量变量值

Ram*_*uri 0 c++ constants

我知道我们在 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 变量值?

cdh*_*wie 5

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

  • 我会给你一个更好的,并说如果它没有将它们存储在 const 页中,那是因为它将它们内联在汇编代码本身中。 (2认同)
  • @RamPrabodhInduri 这表明成员函数 `cmp::operator()` 可以对 `const cmp` 对象进行操作。该成员中的隐式“this”指针实际上是“const cmp *”类型。函子通常作为 const 值或通过引用 const 来传递,因此如果没有 `const`,就无法在 const `cmp` 值或其引用上调用 `operator()`。 (2认同)
  • 或者(3)[使用一些遗留的不正确的系统](/sf/ask/187145591/)。 (2认同)