const_cast <double *>有效,但const_cast <int *>不是</int *> </double *>

时间:2015-03-30 10:52:16

标签: c++ pointers integer const-cast

我的问题是,为什么第一部分代码在第二部分工作时不起作用。非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

2 个答案:

答案 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:未定义未定义的行为。