C++ const_cast的奇怪行为

C++ const_cast的奇怪行为,c++,reference,const-cast,C++,Reference,Const Cast,考虑以下代码: 我声明了一个新的引用端,并通过const_cast将其分配给值a。然后我只是增加参考值,打印地址和值 #include <iostream> using namespace std; int main() { const int a = 7; int &b = const_cast<int&>(a); ++b; cout<<"Addresses "<<&a<<"

考虑以下代码:

我声明了一个新的引用端,并通过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
#包括
使用名称空间std;
int main()
{
常数INTA=7;
int&b=常数(a);
++b;

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

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

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


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

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


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

即使const\u cast可能会从任何指针或引用中删除constness,使用生成的指针或引用写入声明为const invo的对象没有定义的行为

查看此处的示例以了解更多说明:


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

查看此处的示例以了解更多说明:


<> P> >通过conStCype修改任何一个本身声明为const的对象的尝试,结果是根据ISOC++标准导致未定义的行为。

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

编辑:有关详细信息,请参阅此网站


<> P> >通过conStCype修改任何一个本身声明为const的对象的尝试,结果是根据ISOC++标准导致未定义的行为。

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

编辑:有关详细信息,请参阅此网站