C++强制类型转换const_cast()注意事项

const_cast<>() 只能通过引用或指针来取消所指向的const变量的const属性。

比如

const int a = 0; 
int b = const_cast(a);

这句话就编译不通过。

但是改成指针形式就可以了。如下:

const int a = 0; 
int *b = const_cast(&a);

或者改成引用形式。引用有两种方式都成立,但是意义却不同:

int b = const_cast(a); 
int &b = const_cast(a);

第一种方式b是一个新的int变量,结果不和a联动。

第二种方式b是a的引用,结果是和a联动的。

但是——最关键的部分来了,如果const int a = 0;这句话是这么定义的,那么即使b和a就理论上来说应该是联动的,但事实上b和a还是不联动的。虽然这时有&b = &a(这里就指针的形式int *b = const_cast<int*>(&a);来说)仍然如此。也就是说如果写一条语句b = 1;打印b的值为1,而打印a的值还是为0。这是为什么呢?这是因为编译器在编译的时候就把a的值用字面值常量0取代了。

那么怎么解决这个理论上应该取消了const属性的const变量却不能修改其值的问题呢?

如果把const int a = 0;这句话改为如下内容:

int x = 0; 
const int a = x;

这下问题迎刃而解。修改b就和修改a一样了。

有人说的好,C++的语言设计者是如此的纠结,明明前面定义了const的变量就是为了防止修改,却又为了给自己一条反悔的后路不惜祭出const_static,其他语言都没有这种玩意儿,不过这也有力说明了C++是多么灵活的语言。

综上所述,const_static还是慎用为好

 

-----------------------转自 AngelsThanatos

posted @ 2012-04-14 16:27  ForFreeDom  阅读(3411)  评论(0编辑  收藏  举报