【问题标题】:Can we use `const_cast` to modify a constant variable? [duplicate]我们可以使用 `const_cast` 来修改常量变量吗? [复制]
【发布时间】:2013-10-13 01:34:24
【问题描述】:
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

*piaia 具有相同的地址,但它们的值不同。我的目的是用const_cast修改一个常量值,结果显示不行。

有人知道为什么吗?

【问题讨论】:

    标签: c++ compiler-optimization volatile const-cast


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      修改常量值是未定义的行为。不要这样做。如需修改值,请勿声明为const

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2012-11-01
        • 2014-07-14
        相关资源
        最近更新 更多