为什么var和* to var在这个const_cast示例中给出了diff值

时间:2010-07-08 14:44:52

标签: c++

检查此示例是否为const的const_cast。 我正在使用VC ++ 2008来编译它。

#include <iostream>
using namespace std;

void main() {
const int x=0;
int y=90;
int *p = const_cast<int *> (&x);
*p=y;

cout<<" value of x: "<<x<<" addr of x "<<&x<<endl
    <<" and *p : "<<*p<<" and addr p "<<p<<endl;

}

=====

输出

value of x: 0 addr of x 0012FF60
 and *p : 90 and addr p 0012FF60

4 个答案:

答案 0 :(得分:5)

你不应该const_cast一个定义为const的变量。我手边没有标准,但我相当肯定它将这样的操作定义为导致未定义的行为。

有关导致未定义行为的原因的一个示例,请考虑将定义为const的内容存储在非易失性存储器(闪存,EEPROM或更不稳定的东西)中的MCU。

还需要阅读C++ FAQ Lite

答案 1 :(得分:4)

以下程序

#include <iostream>

int main() {
    const int x=0;
    int y=90;
    int *p = const_cast<int *> (&x);
    *p=y;

    std::cout << " value of x: " << x  << " addr of x "  << &x << '\n'
              << " and *p : "    << *p << " and addr p " << p  << '\n';
    return 0;
}

VC9为我打印相同的地址。但是:

  1. 您正在调用未定义的行为 ,因为如果该对象是真正的const值,则不允许从对象中抛弃const 。 (例如,OTOH,如果该引用引用非const值,则允许您从const引用中删除const。)
    理论上,当您调用未定义的行为时,根据C ++标准,您的程序可能会按预期工作,或者可能不会,或者它可能仅在星期日,或者除非它是假日和满月。但它也可以格式化你的高清,炸毁你的显示器,让你的女朋友怀孕。根据C ++标准,所有这些(以及无数其他可能性)都是好的 在实践中,这样的程序可能会打印出有趣的地址。

  2. 编译器可能会完全优化您的所有代码 ,只需输入虚拟值进行打印。但是,对于Debug版本,它不应该这样做。 (虽然这是QoI问题,但不是要求。)

答案 2 :(得分:1)

编译器正在优化别名。在调试模式下尝试,并禁用优化。

修改

编译器正在优化别名,是的,但这不是优化中的错误。相反,代码正在做一些未定义的事情,这会导致不必要但合法的行为。 Staffan的回答澄清了这一点。

正如常见问题解答所说,几乎在所有你很想使用const_cast的情况下,你都应该使用mutable。如果在此处的示例代码中,您无法使用mutable,则表明可能错误。

答案 3 :(得分:0)

也许它是由编译器优化的。他有权这样做。 它是滥用const_cast的缺点。 永远不要以这种方式使用const_cast。