【发布时间】:2010-01-05 13:07:05
【问题描述】:
我正在尝试更改定义为 int const 的变量的值,如下所示。
const int w = 10;
int* wp = const_cast <int*> (&w);
*wp = 20;
w 的值没有改变,即使在赋值之后也是 10,尽管它表明 w 和 wp 都指向同一个内存位置。但是如果在声明时定义如下,我可以更改 w 的值
int i = 10;
const int w = i;
如果我更改 i 的声明以使其像 in 一样 const
const int i = 10;
w 的值不变。
在第一种情况下,为什么 w 的值没有改变,即使 w 和 wp 指向同一个内存位置[这是我打印它们的地址时得到的印象]
编译器对这两种情况的处理方式不同有什么不同?
有没有办法确保 w 不会失去常量,而不管它的定义方式如何?
【问题讨论】:
-
如果一个对象最初被创建为
const,那么你不能(不应该)将const_cast它设置为非const;这是未定义的行为。如果一个对象最初创建为非const,您可以随意来回const_cast。 -
在某些实现中,如果对象的内容位于只读部分中(例如,
.rodata而不是.data,则写入const对象可能会使您的程序崩溃) -const数据位)。 -
似乎没有人提出明显的问题——如果你想改变值,为什么要把变量标记为
const? -
@Graeme:不,OP 想要一种方法让
const坚持下去,即保证人们不能const_castconstness 远离他们的对象。这在问题的最后一行中说明。 -
我不是在尝试更改值,而是在尝试了解差异以及如何禁止其他人使用我的程序。我试图发表更大的评论,但它似乎比应该发表的评论更大。将改写和评论。