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