通过非const指针修改const

jas*_*ine 13 c++ pointers casting const-correctness

我对以下代码中发生的事情感到有点困惑:


const int e = 2;

int* w = ( int* ) &e;          // (1) cast to remove const-ness
*w = 5;                        // (2)

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2

cout << "w = " << w << endl;   // (5) w points to the address of e
cout << "&e = " << &e << endl;
Run Code Online (Sandbox Code Playgroud)

在(1)中,w指向e的地址.在(2)中,该值变为5.但是,当显示*w和e的值时,它们的值不同.但是如果你打印w指针和&e的值,它们具有相同的值/地址.

为什么e仍然包含2,即使它被改为5?他们存放在一个单独的位置?还是暂时的?但是,为什么w指出的价值仍然是e的地址?

小智 17

正如我在评论中所说,一旦修改了const值,你就处于未定义的行为状态,所以谈论正在发生的事情并没有多大意义.但到底是什么..

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2
Run Code Online (Sandbox Code Playgroud)

猜测*w是,正在运行时进行评估,但是e被视为编译时常量

  • 很多,const的重点是你不修改价值......你永远不应该抛弃const. (2认同)

Pet*_*man 8

我怀疑你正在绊倒编译器.它不希望你用e玩肮脏的技巧,所以当它看到线时:

cout << e << endl;
Run Code Online (Sandbox Code Playgroud)

它只是插入值2而不是查找实际值.您可以通过查看程序的反汇编来验证(或反驳)这一点.