从const_cast引出的一个问题

原创 2006年05月24日 13:44:00

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

const_cast问题

转自 http://blog.csdn.net/guogangj/article/details/1545119 C++的const_cast的问题 分类: Windows编程2007...

C++中四种类型转换以及const_cast是否能改变常量的问题

we have four specific casting operators:dynamic_cast, reinterpret_cast, static_cast and const_cast. ...

C++的const_cast的问题

转自:http://blog.csdn.net/guogangj/article/details/1545119 和上一篇文章一样了,还是提起一下大约一年前我来公司面试所遇到的一道题目,题目很简...

C++编码器军规(003):避免对一个声明为const的变量使用const_cast

const_cast的使用及风险分析

MFC遇到的一个字符集问题:不能将参数1从“const char []”转换为“LPCTSTR”

今天在使用vs2008+MFC时候,使用editControl的replacesel(“”)发生报错。如下::不能将参数1从“const char []”转换为“LPCTSTR”其解决方案就是, 在项...
  • kkk328
  • kkk328
  • 2011-07-18 09:31
  • 2703

一个VC编译错误引发的对显示类型转换的思考(static_cast、dynamic_cast和const_cast)

error C2662: 'getY' : cannot convert 'this' pointer from 'const class point' to 'class point &' 的解决办...

C++类型转换详解--const_cast

原文地址:http://blog.csdn.net/lwbeyond/article/details/6213382 一. 函数描述: const_cast ( expression )...

有关一条常见的const_cast转换的“BUG”解释

经常看到有这么一段代码,说一个诡异的现象。 举个例子像这篇博文中的最后一段: http://blog.csdn.net/mougaidong/article/details/6372765 当然和博...

C++ 关键字的使用(const static explict reinterpret_cast)

1  volatile 有些变量是用volatile关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该用volatile声明,该关键字的作用是防止优化编译器把变量从内存装入CPU...

C++类型转换详解--const_cast

一. 函数描述: const_cast ( expression ) 主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。 去掉const属性:const_c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)