我试图更改一个被定义为int const的变量的值,如下所示。
const int w = 10;
int* wp = const_cast <int*> (&w);
*wp = 20;
尽管看起来w和wp指向同一内存地址,但赋值后w的值没有改变,仍为10。但如果在声明时按以下方式定义,则可以更改w的值。
int i = 10;
const int w = i;
如果我将i的声明更改为const,就像这样:
const int i = 10;
w的值没有改变。
在第一种情况下,尽管w和wp指向同一内存位置(当我打印它们的地址时得到这种印象),但w的值为什么没有更改呢?
编译器如何处理这两种情况有何不同之处?
有什么办法可以确保无论如何定义,w都不会失去constness吗?
const
,那么你不应该把它用const_cast
转化成非const
类型,这是未定义的行为。如果一个对象最初是作为非const
类型创建的,你可以随意使用const_cast
来进行类型转换。 - C. K. Youngconst
对象的内容位于只读区域(例如.rodata
而不是非const
数据所在的.data
),写入该对象可能会导致程序崩溃。请注意,此处的翻译已经尽可能保证通俗易懂且不改变原意。 - C. K. Youngconst
属性不能被移除,即保证人们无法使用const_cast
从他们的对象中移除const
属性。这在问题的最后一行中有所说明。 - C. K. Young