const_cast<double*> 有效,但 const_cast<int*> 不起作用



我的问题是,为什么代码的第一部分不起作用,而第二部分起作用。非常量指针应该使用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

修改const变量是未定义的行为:

n4296§7.1.6.1/4

除了任何被声明为可变的类成员(7.1.1)都可以被修改之外,在const对象的生存期(3.8)内,任何修改该对象的尝试都会导致处于未定义的行为。

CCD_ 2通常用于与非常量正确API通信或丢弃volatile限定符;它不应该这样使用。

非常量指针应该使用const_cast修改const值,但对于整数,此技巧不起作用。

否,修改常量值的非常量指针是未定义的行为。它不应该起作用。

你能解释一下为什么会这样吗?

由于这是UB,编译器在这里可以自由地做任何事情,"任何事情都可以"意味着代码只在int的情况下工作(至少对编译器来说是这样)。

TLDR:未定义的行为是未定义的

最新更新