在更改const_cast PTR/REF对象值之后,我发现了一个相同地址不同值的奇怪问题。
#include <iostream>
using namespace std;
int main(void){
const auto i=123;
auto &ref2i=i; auto ptr2i=&i;
auto pp=const_cast<int*>(ptr2i); *pp=456;
cout<<&i<<" with value "<<i<<endl;
cout<<pp<<" with value "<<*pp<<endl;
cout<<ptr2i<<" with value "<<*ptr2i<<endl;
auto &rr=const_cast<int&>(ref2i); rr=789;
cout<<i<<endl;
cout<<ref2i<<endl;
cout<<rr<<endl;
}
到底是怎么回事?
https://paiza.io/projects/hylgbhxd2khynpcldwjnva?language=cpp
输出:
0x7ffc1b0e8b54 with value 123
0x7ffc1b0e8b54 with value 456
0x7ffc1b0e8b54 with value 456
123
789
789
如果您拼写出PTR2I
的类型,您将得到:
const int * ptr2i = &i; // since i is const
现在您可以将const_cast
此const int*
转换为int*
:
auto pp = const_cast<int*>(ptr2i); // ok
但是指向变量i
的类型为const int
,因此如果您尝试修改此指向值:
*pp = 456; // oops, UB since you are attempting to modify i
调用未定义的行为。这可能导致一个程序做任何事情,包括在同一个地址显示不同的值。
当您将常量int&
强制转换为int&
,然后尝试修改它时,同样的限制也适用。