【问题标题】:const_cast: same address but different value? [duplicate]const_cast:相同的地址但不同的值? [复制]
【发布时间】:2014-01-05 20:43:10
【问题描述】:

刚接触 C++ 并学习 const_cast — 被下面的代码弄糊涂了:

int main(){
    const int j = 1;
    int * p = (int *)(&j);
    cout << j << ' ' << *p << endl;
    cout << &j << ' ' << p << endl;
    *p = 2;
    cout << j << ' ' << *p << endl;
    cout << &j << ' ' << p << endl;

    const int k = 1;
    int * q = const_cast<int*>(&k);
    cout << k << ' ' << *q << endl;
    cout << &k << ' ' << q << endl;
    *q = 2;
    cout << k << ' ' << *q << endl;
    cout << &k << ' ' << q << endl;

    return 0;
}

输出是

1 1
00A2FD9C 00A2FD9C
1 2
00A2FD9C 00A2FD9C
1 1
00A2FD84 00A2FD84
1 2
00A2FD84 00A2FD84

谁能告诉我为什么地址(&i 和 p,或 &j 和 q)相同,但值(i 和 *p,或 j 和 *q)不同?我正在使用 Visual Studio 2013RC。

【问题讨论】:

  • 未定义的行为是未定义的。不要修改常量数据。
  • @chris tautology 处于最佳状态。

标签: c++ const-cast


【解决方案1】:

发生这种情况是因为编译器可以假设 const 变量不会改变,因此当您的代码引用它时,编译器会假设使用变量值,或者初始化时的原始值无关紧要,它应该t 改变行为,所以它编译成更快的执行,只使用常量1 而不引用内存位置。

【讨论】:

  • 此外,由于类型不同,还允许编译器假设k不能通过写入*q来修改。在这里,它们的区别在于 const 限定符,但允许存在任何类型的差异。
  • @MatthewLundberg 在转换为 char/unsigned char 指针时是不允许的吗?因为它可以给任何类型起别名(C++11 3.10p10)。
【解决方案2】:

使用const_cast&lt;T*&gt;(obj) 抛弃常量如果obj 以常量开始其生命,则修改对象是未定义的行为。在您的示例中,您告诉编译器 j 不会改变,编译器只是替换 j 的所有用途以成为 1 的用途。然后,您违反了承诺,编译器生成的代码将不再关注您,而是做自己喜欢的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2014-08-07
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多