1

考虑以下代码:

我声明了一个新的引用端,通过 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个不同的值?

4

4 回答 4

6

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

于 2014-04-22T07:16:21.877 回答
5

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

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

于 2014-04-22T07:21:52.053 回答
2

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

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

编辑:有关更多信息,请参阅此站点

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

于 2014-04-22T07:31:55.313 回答
2

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

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

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

于 2014-04-22T07:22:57.500 回答