从const_cast引出的一个问题

看到const_cast,于是想做一件正常的事:用const_cast移除某对象的常数性,修改之。于是像下面这样写:
        const int i = 10;
        //int& ri = const_cast<int>(i); // error! 
        int& ri = const_cast<int&>(i);
        ri = 0;
        cout << &ri << "=" << ri << endl;
        cout << &i << "=" << i << endl;

我一开始就写错了,得到编译器一个指示:invalid use of const_cast with type 'int', which is not a pointer, reference, nor a pointer-to-data-membe
r type(GCC4.0)。哦,原来如此!只是我以前不知道的:const_cast转型的类型必须是指针、引用。

编译是过了,可输出却不是我的想象:
0xbffffaac=0
0xbffffaac=10

我猜,也许是编译器做了手脚,对const int对象做了优化。另外一段代码也可以从旁辅证这个臆测,我把const的对象换成了string:
        const string s("this is a string");
        string& rs = const_cast<string&>(s);
        rs = "crack";
        cout << &rs << "=" << rs << endl;
        cout << &s << "=" << s << endl;

而输出是:
0xbffffa9c=crack
0xbffffa9c=crack

预料之中呀。

这样,我就自信一点了。推测,因为编译器不了解string,但是它太清楚那些内置型别了,于是就偷偷多做了一下事情。试验了一下,const char是如此,const char* const也是这般。我只在GCC4上面试了一下,偷懒了。如果果真是编译器这样优化了,那么有什么危害没有?换个提法,我们需要针对const内置型别用const_cast进行篡改活动吗?

我暂时没有想到用处。哈哈。

顺便引出个问题:引用有地址吗?

我想有地址吧,在计算机里面的东西没个地址怎么行呢。但是印象中(对不对哟??)c++并没有提供给我们方法去得到引用的地址。因为引用的地址是没有意义的。在我看来引用就相当于一个特殊的常量指针。定义就需要赋值,永不需要修改,地址的意义也就自然无从谈起了。

引用,一个扼守one life one love的人。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值