8
int main()
{
    const int ia = 10;

    int *pia = const_cast<int*>(&ia);
    *pia = 5;

    std::cout << &ia << "\t" <<  pia <<endl;
    std::cout <<  ia << "\t" << *pia <<endl;

    return 0;
}

输出是:

0x28fef4       0x28fef4
10             5

*pia并且ia具有相同的地址,但它们具有不同的值。我的目的是用来const_cast修改一个常量值,但是结果显示它不起作用。

有谁知道为什么?

4

2 回答 2

9

10您看到print for的原因ia很可能是编译器优化:它看到一个const对象,决定它不会改变,并用以下内容替换最后的打印输出:

cout<< 10 <<"  "<<*ppa<<endl;

换句话说,生成的代码具有const“烘焙到”二进制文件的值。

抛弃最初声明为的对象的 const-nessconst并写入该对象是未定义的行为:

$5.2.11/7 - 注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写操作由丢弃 const 限定符的 const_cast 68) 可能产生未定义的行为 (7.1.5.1) .

根据平台的不同,const对象可能被放置在内存的受保护区域中,您无法写入该区域。解决const类型系统中的 -ness 可能有助于您的程序编译,但您可能会看到随机结果甚至崩溃。

于 2013-10-06T11:55:59.760 回答
7

修改常量值是未定义的行为。不要这样做。如果您需要修改该值,请不要将其声明为const.

于 2013-10-06T11:55:46.567 回答