c – 使用const_cast 的奇怪行为
发布时间:2020-12-16 09:51:02 所属栏目:百科 来源:网络整理
导读:参见英文答案 Two different values at the same memory address????????????????????????????????????6个 我知道使用const_cast通常是个坏主意,但我正在玩它并且我遇到了一个奇怪的行为,其中: 两个指针具有相同的地址值,但在取消引用时,给出不同的数据值.
参见英文答案 >
Two different values at the same memory address????????????????????????????????????6个
我知道使用const_cast通常是个坏主意,但我正在玩它并且我遇到了一个奇怪的行为,其中: 两个指针具有相同的地址值,但在取消引用时,给出不同的数据值. 有没有人对此有解释? 码 #include <iostream> int main() { const int M = 10; int* MPtr = const_cast<int*>(&M); (*MPtr)++; std::cout << "MPtr = " << MPtr << " (*MPtr) = " << (*MPtr) << std::endl; std::cout << " &M = " << &M << " M = " << M << std::endl; } 产量 MPtr = 0x7fff9b4b6ce0 (*MPtr) = 11 &M = 0x7fff9b4b6ce0 M = 10 解决方法
因此,除了“它的未定义行为”(它是)之外,编译器完全可以使用M是常量的事实,因此在cout的评估中不会改变…<< M << ...,所以可以使用具有立即值10的指令,而不是存储在M的存储器中的实际值.(当然,标准不会说明这是如何工作的,而不是“它是未定义的”,以及编译器能够在不同的情况下选择不同的解决方案等等,所以如果你修改代码,使用不同的编译器,不同版本的编译器或风向不同的方向,你完全有可能得到不同的结果) . “未定义行为”的部分棘手问题在于它包含的内容“完全符合您的预期”以及“几乎您所期望的”.如果发现这就是你正在做的事情,编译器也可以决定启动俄罗斯方块. 是的,这是你不应该使用const_cast的原因之一.至少不是那些原本是const的东西 – 如果你有这些方面的东西就可以了:
int x; void func(const int* p) { ... int *q = const_cast<int *>(p); *q = 7; } ... func(&x); 在这种情况下,x实际上不是const,当我们将它传递给func时它就变成了const.当然,编译器可能仍然认为x在func中没有改变,因此你可能会遇到问题…. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |