C++ const_cast的奇怪行为
考虑以下代码: 我声明了一个新的引用端,并通过const_cast将其分配给值a。然后我只是增加参考值,打印地址和值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<<"
#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类型的变量或表达式可能表示存储在写保护内存中的对象,任何修改对象的尝试都会导致未定义的行为
编辑:有关详细信息,请参阅此网站