请考虑以下代码:
我声明一个新的引用结束赋值给一个via const_cast。然后我只是增加参考值打印地址和值。
#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个不同的值?
答案 0 :(得分:6)
因为修改声明为const
的变量是未定义的行为,所以任何都可能发生。
答案 1 :(得分:5)
修改常量对象会产生未定义的行为,因此您的程序可以(原则上)执行任何操作。
保持此行为未定义的一个原因是允许优化用其值替换常量变量(因为您已声明该值永远不会更改)。这就是这里发生的事情:a
在编译时被替换为值7
,因此无论您在运行时尝试做什么,都会保留该值。
答案 2 :(得分:2)
尽管const_cast可以从任何指针或引用中删除constness,但使用结果指针或引用来写入声明为const的对象会调用未定义的行为。
查看此处的示例以获取更多说明:
答案 3 :(得分:2)
根据ISO C ++标准,任何修改通过const_cast自身声明为const的对象的尝试都会导致未定义的行为。
当我们引用“const对象”时,它打算说对象所在的存储器可能被写保护。也就是说,const类型的变量或表达式可以表示存储在写保护存储器中的对象,并且任何修改对象的尝试都会导致未定义的行为
编辑:请参阅此网站了解更多信息
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0571.asc