今天码了个代码,但是发现有些奇葩的地方
int f(int const &s)
{
const_cast<int&>(s) = 3;
cout <<"\n s's address :"<< &s<<" s's value:"<<s;
return s;
}
void main(void){
const int w = 4;
int const *p = &w;
int ww = const_cast<int&>(w);
ww++;
cout << "\n w's address:" << p << " w's value:" << w;
f(w);
cout << "\n w's address:" << p << " w's value:" << w;
data stats;
collectdata(stats);
print(stats);
system("pause");
}
结果显示
虽然这种事情不会出现在项目中(没人这么无聊这么测试),不过就是觉得有些奇葩,这结果显示3的确只存在于f()函数中,而且只有局部作用域,但是问题是显示的地址一样,也说明的确处理的是同一个变量,看来这肯定是与const_cast的实现有关了(CPP不推荐类型转换,因为不好,而且容易出错),这里就是觉得有些奇怪而已,暂时没找到这种情况的解答,希望有高手帮忙解答,谢谢。
经过昨晚 小全同学的解释,这是常量折叠,意思就是当在代码中写出const int w=4 这样的语句的时候,大多数的编译器会在编译的时候直接用数字4代替所有 w 出现过的地方,它的行为和宏类似,但是它却有内存地址,所以才有主函数中凡是 w 的 地方都是显示4,而地址也的确说明是同一个区域,那说明另一个const_cast的确是运行时才确定的,但是使用const_cast这样的操作符会导致未定义行为,就是如上面例子中给他去const属性然后还对它赋值本身就是一种违反const的行为,这种行为没有在cpp标准中定义,由各大编译器自行决定(这可不是一个好程序员该做的)。
所以,上面的结果其实涉及了两个知识点。