[英]Why the var and * to var gives diff values in this example of const_cast
在此示例中检查int的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
您不应该const_cast定义为const的变量。 我手头没有这个标准,但我可以肯定它定义了这样一种操作,导致未定义的行为。
有关导致未定义行为的原因的示例,请考虑使用MCU,其中定义为const的内容存储在非易失性存储器(闪存,EEPROM或什至不易挥发的内容)中。
在C ++ FAQ Lite中还有更多内容可供阅读。
对于以下程序
#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为我打印相同的地址。 然而:
您正在调用未定义的行为 ,因为如果该对象是真正的const值,则不允许该对象抛弃const
。 (OTOH,你是,例如,允许抛弃const
从const
参考如果参照是指非const
值)。
从理论上讲,当您调用未定义的行为时,根据C ++标准,您的程序可能会按预期运行,或者可能无法运行,或者可能仅在星期日运行,或者除非是假日和满月。 但这也可能会格式化HD,炸毁显示器并让女友怀孕。 根据C ++标准,所有这些(以及无数其他可能性)都是可以的。
实际上,这样的程序可能会打印出有趣的地址。
编译器可能会完全优化您的所有代码,而只是输入虚拟值以进行打印。 但是,对于调试版本,不应该这样做。 (尽管这是一个QoI问题,而不是必需的。)
编译器正在优化别名。 在调试模式下尝试,禁用优化。
编辑
是的,编译器正在优化别名,但这并不是优化中的错误。 而是,代码正在执行未定义的操作,这导致了不想要的但合法的行为。 Staffan的答案澄清了这一点。
就像FAQ所说,在几乎所有试图使用const_cast
情况下,您都应该使用mutable
。 如此处的示例代码中所示,如果您不能使用mutable
,则表明可能有问题。
也许它是由编译器优化的。 他有权这样做。 这是滥用const_cast的缺点。 切勿以这种方式使用const_cast。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.