这个问题已经在这里有一个答案:
在下面的代码,我期待任一可变x
放在一个只读存储器,并因此无论我们经由非恒定指针做就可以/参考是没有效果,在这种情况下*y
应当等于0或关键字const
仅仅是编译时检查,我们可以做任何我们想要在运行时,在这种情况下,两个x
和*y
应该等于20。但是我得到的是x
等于0和*y
至20 (似乎y
没有指向x
!!)
#include <iostream>
int main()
{
const int x = 0 ;
int *y = (int*) &x ;
*y = 20 ;
std::cout << x << std::endl ; //output 0
std::cout << *y << std::endl ; //output 20
}
通过优化产生的问题的一个很好的例子,也是为什么你应该使用这样的东西要小心。关键字常量的主要目的就是告诉这个值不会改变编译器和编译器可能(但不是必须)优化它。更effecient只是把使用值20,而不是去记忆和提取的实际值的汇编指令,这是编译器做了什么。因为你允许它。编译器是没有义务遵循指针和实际检查您修改的内容。因此,这是你在这里未定义行为,这是多么的常量的作品。