关闭

从const_cast引出的一个问题

标签: 编译器stringreferencegcc优化c++
1034人阅读 评论(0) 收藏 举报
分类:

看到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的人。 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:39620次
    • 积分:530
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:1篇
    • 译文:3篇
    • 评论:6条
    最新评论