【问题标题】:Strange behavior of const_cast [duplicate]const_cast 的奇怪行为
【发布时间】:2014-06-06 10:29:00
【问题描述】:

考虑以下代码:

我声明了一个新的引用端,通过 const_cast 将它分配给值 a。然后我只是增加参考值打印地址和值。

#include <iostream>
using namespace std;
int main()
{
    const int a = 7;
    int &b = const_cast<int&>(a);
    ++b;
    cout<<"Addresses  "<<&a<<" "<<&b<<endl;
    cout<<"Values  "<<a<<" "<<b<<endl;
}

//output
Addresses  0x7fff11f8e30c 0x7fff11f8e30c
Values  7 8

如何在同一个地址中有 2 个不同的值??

【问题讨论】:

    标签: c++ reference const-cast


    【解决方案1】:

    因为修改声明为const 的变量是未定义的行为,所以任何事情都可能发生。

    【讨论】:

      【解决方案2】:

      修改常量对象会产生未定义的行为,因此您的程序(原则上)可以做任何事情。

      未定义此行为的一个原因是允许优化用其值替换常量变量(因为您已声明该值永远不会改变)。这就是这里发生的情况:a 在编译时被值 7 替换,因此无论您在运行时尝试对它做什么,都会保留该值。

      【讨论】:

        【解决方案3】:

        即使 const_cast 可以从任何指针或引用中删除 const ,使用生成的指针或引用写入声明为 const 的对象会调用未定义的行为。

        查看此处的示例以获得更多说明:

        http://en.cppreference.com/w/cpp/language/const_cast

        【讨论】:

          【解决方案4】:

          根据 ISO C++ 标准,任何通过 const_cast 修改本身声明为 const 的对象的尝试都会导致未定义的行为。

          当我们提到“const object”时,它的意思是说对象所在的内存可能是写保护的。也就是说,const 类型的变量或表达式可能表示存储在写保护内存中的对象,并且任何修改该对象的尝试都会导致未定义的行为

          编辑:请参阅此网站了解更多信息

          http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0571.asc

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-08
            • 2015-07-20
            • 2010-10-03
            • 2021-07-12
            • 2013-10-04
            • 2019-01-23
            相关资源
            最近更新 更多