我的问题是,为什么第一部分代码在第二部分工作时不起作用。非const指针应该先使用const_cast修改const值,但是使用整数这个技巧不起作用。你能解释一下为什么会这样吗?
const int i = 5;
cout << i << endl; //output: 5
int *ptr_i = const_cast<int*>(&i);
*ptr_i = 100;
cout << i << endl; //output : 5
const double d = 5;
cout << d << endl; //output : 5
double *ptr_d = const_cast<double*>(&d);
*ptr_d = 100.;
cout << d << endl; //output : 100
答案 0 :(得分:5)
修改const
变量是未定义的行为:
n4296§7.1.6.1/ 4
除了可以修改声明为mutable(7.1.1)的任何类成员, 任何在其生命周期(3.8)结果中修改const对象的尝试 在未定义的行为中。
const_cast
通常用于与非const-correct API通信或丢弃volatile
限定符;它不应该像这样使用。
答案 1 :(得分:2)
非const指针应该先使用const_cast修改const值,但是使用整数这个技巧不起作用。
不,修改const值的非常量指针是未定义的行为。它不应该工作。
你能解释一下为什么会这样吗?
由于这是UB,编译器可以在这里自由地做任何事情,并且“任何事情”都意味着代码将仅在int的情况下工作(至少对于你的编译器)。
TLDR:未定义未定义的行为。