本文共 2347 字,大约阅读时间需要 7 分钟。
const_cast用于添加或者删除指针或者引用的const属性,但是对于删除const属性的功能有一些bug:
可以构造结构体或者类的非const指针或者引用给新变量,但是原变量的const属性不变化,新变量可以修改对应的内容;但是如果是一个基本类型的const变量,譬如cosnt char *,const int等等,不会修改其内容。
所以,还是应该遵从这样的原则:使用const_cast去除const限定的目的绝对不是为了修改它的内容(来自:)其中有些观点很有概括性,譬如:C++对于指针的转换是任意的,它不会检查类型,任何指针之间都可以进行互相转换。int * 可以强制转换为float*,const int *可以强制转换为int *,int *可以转换为char *
以下转自:
1. 常量指针被转化成非常量指针,转换后指针指向原来的变量(即转换后的指针地址不变)。
反汇编发现,虽然我没有使用优化,但系统还是对ica这个const进行了预编译般的替换,将它替换成“64h”(十六进制的64就是十进制的100)。其实ica地址上的值已经变了,这点从ia的输出可以看出,但由于系统对这个ica进行了预编译替换,从而导致输出ica的值没有变。这算是个C++的bug吧。
2. 常量引用被转换成非常量引用。
3. 常量对象(或基本类型)不可以被转换成非常量对象(或基本类型)。
记住这种转换只是开了一个接口,并不是实质上的转换。(其实也算是实质上的转换了,只不过表达上不允许这样写)
4. 添加const属性
三. 总结: 1. 使用const_cast去掉const属性,其实并不是真的改变原类类型(或基本类型)的const属性,它只是又提供了一个接口(指针或引用),使你可以通过这个接口来改变类型的值。也许这也是const_case只能转换指针或引用的一个原因吧。
2. 使用const_case添加const属性,也是提供了一个接口,来不让修改其值,不过这个添加const的操作没有什么实际的用途(也许是我认识太浅了)。
3. 从对基本类型(int,char)的输出来看,使用const_case转换后的输出有点像闹剧!也许const_case只是给编译器用的。
4. 唉,使用const_case可能就是不让你用const_case?!
转载地址:http://sfeti.baihongyu.com/