#include <iostream>
using namespace std;
int main() {
const int N = 22;
int * pN = const_cast<int*>(&N);
*pN = 33;
cout << N << '\t' << &N << endl;
cout << *pN << '\t' << pN << endl;
}
Run Code Online (Sandbox Code Playgroud)
22 0x22ff74
33 0x22ff74
为什么同一地址有两个不同的值?
鉴于以下C++代码:
#include <iostream>
int main()
{
const int i = 1;
*const_cast<int*>(&i) = 1; // Not allowed but doesn't do anything?
std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)
问题:上面的代码是否调用UB(未定义的行为)?我知道抛弃const并为iUB中的结果赋值,因为我们不允许更改const变量的值.但是,在上面的代码中,我实际上没有更改 - 的值i- 那么,这仍然是UB吗?
我们先看一下例子。
#include <iostream>
int main()
{
const int constant = 1;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 100;
std::cout << "constant: " << constant << ", *const_p=" << *const_p;
//Output: constant: 1, *const_p=100
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不知道它在内存架构上是如何实现的。看来编译器在堆栈中占用了额外的内存空间,以便我们可以跟踪值为constant的“原始” 1,以及堆栈中值为 的新内存位置100。是吗?那么,const_cast确实会消耗额外的内存,这是初学者可能没有想到的吗?