C如何保持const值?
参见英文答案 >
Two different values at the same memory address????????????????????????????????????6个
#include <iostream> using namespace std; int main() { const int a = 10; auto *b = const_cast<int *>(&a); *b = 20; cout << a << " " << *b; cout << endl << &a << " " << b; } 输出如下: 10 20 0x7ffeeb1d396c 0x7ffeeb1d396c a和* b位于同一地址,为什么它们具有不同的值? 解决方法
很可能这是由优化引起的.
正如molbdnilo在他的评论中已经说过:“编制者盲目地信任你.如果你骗他们,可能会发生奇怪的事情.” 因此,当启用优化时,编译器会找到声明 const int a = 10; 并且认为“啊,这永远不会改变,所以我们不需要一个”真正的“变量,并且可以用10”替换代码中a的所有外观.此行为称为constant folding. 现在在下一行你“欺骗”编译器: auto *b = const_cast<int *>(&a); *b = 20; 并改变了,虽然你已经答应不这样做. 就像很多人已经提到的那样,Christian Hackl在他出色的深入答案中进行了彻底的分析,这是不确定的行为.通常允许编译器对常量应用常量折叠,常量显式声明为const. 你的问题是一个很好的例子(我不知道怎么会有人投票!)为什么const_cast非常危险(当与原始指针组合时更是如此),应该只在绝对必要的情况下使用,并且应该至少彻底评论了为什么它被使用,如果它是不可避免的.在这种情况下,评论很重要,因为它不仅是你“欺骗”的编译器: 您的同事也将依赖于信息const并依赖于它不会改变的信息.如果它虽然改变了,你没有通知他们,也没有发表评论,也不知道你在做什么,你将在工作中度过糟糕的一天:) 尝试一下:也许你的程序在调试版本(未优化)和发布版本(优化)中甚至会表现不同,而这些错误通常很难修复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |