const_cast的奇怪行为

时间:2014-04-22 07:15:28

标签: c++ reference const-cast

请考虑以下代码:

我声明一个新的引用结束赋值给一个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个不同的值?

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

尽管const_cast可以从任何指针或引用中删除constness,但使用结果指针或引用来写入声明为const的对象会调用未定义的行为。

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

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

答案 3 :(得分:2)

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

当我们引用“const对象”时,它打算说对象所在的存储器可能被写保护。也就是说,const类型的变量或表达式可以表示存储在写保护存储器中的对象,并且任何修改对象的尝试都会导致未定义的行为

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

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