加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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中没有改变,因此你可能会遇到问题….

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读