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