检查此示例是否为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
答案 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为我打印相同的地址。但是:
您正在调用未定义的行为 ,因为如果该对象是真正的const值,则不允许从对象中抛弃const
。 (例如,OTOH,如果该引用引用非const
值,则允许您从const
引用中删除const
。)
理论上,当您调用未定义的行为时,根据C ++标准,您的程序可能会按预期工作,或者可能不会,或者它可能仅在星期日,或者除非它是假日和满月。但它也可以格式化你的高清,炸毁你的显示器,让你的女朋友怀孕。根据C ++标准,所有这些(以及无数其他可能性)都是好的
在实践中,这样的程序可能会打印出有趣的地址。
编译器可能会完全优化您的所有代码 ,只需输入虚拟值进行打印。但是,对于Debug版本,它不应该这样做。 (虽然这是QoI问题,但不是要求。)
答案 2 :(得分:1)
编译器正在优化别名。在调试模式下尝试,并禁用优化。
修改的
编译器正在优化别名,是的,但这不是优化中的错误。相反,代码正在做一些未定义的事情,这会导致不必要但合法的行为。 Staffan的回答澄清了这一点。
正如常见问题解答所说,几乎在所有你很想使用const_cast
的情况下,你都应该使用mutable
。如果在此处的示例代码中,您无法使用mutable
,则表明可能错误。
答案 3 :(得分:0)
也许它是由编译器优化的。他有权这样做。 它是滥用const_cast的缺点。 永远不要以这种方式使用const_cast。