C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用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;
}

产量

@H_849_14@mPtr = 0x7fff9b4b6ce0 (*MPtr) = 11 &M = 0x7fff9b4b6ce0 M = 10

解决方法

因此,除了“它的未定义行为”(它是)之外,编译器完全可以使用M是常量的事实,因此在cout的评估中不会改变…<< M << ...,所以可以使用具有立即值10的指令,而不是存储在M的存储器中的实际值.(当然,标准不会说明这是如何工作的,而不是“它是未定义的”,以及编译器能够在不同的情况下选择不同的解决方案等等,所以如果你修改代码,使用不同的编译器,不@R_487_11197@的编译器或风向不同的方向,你完全有可能得到不同的结果) . “未定义行为”的部分棘手问题在于它包含的内容“完全符合您的预期”以及“几乎您所期望的”.如果发现这就是你正在做的事情,编译器也可以决定启动俄罗斯方块. 是的,这是你不应该使用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中没有改变,因此你可能会遇到问题….

@H_404_38@

大佬总结

以上是大佬教程为你收集整理的c – 使用const_cast 的奇怪行为全部内容,希望文章能够帮你解决c – 使用const_cast 的奇怪行为所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。