Fork me on GitHub

Gotchas 6-对常量(性)的认识误区

摘要:

1)“字面常量没有地址,永远不能改变其值”③
2)关于左值和右值得理解误区:
左值并不是指能放在赋值号左边的值,右值自然也不是指能放到赋值号右边的。左值可以放在赋值号右边,但右值一定只能是在赋值号的右边。但左值也不一定能放在赋值号的左边:
const int i;
对于常量i是不能放在赋值号的左边的,但其的的确确是个左值,它是一个不能改变的左值。
正确的理解是:左值是“能放置值得地方”,而右值就是没有与之相关的地址的值。
3)关于常量性的理解:
int i=10;
const int *ip=&i;
i=10;//没问题,约束的不是i的一般操作,而是通过ip对i的操作
*ip=13;//错误
“const这个修饰词描述了通过ip对i的操作约束,而不是对i一般操作的约束”①
“这里我们就有了一个指向const int类型的指针,而这个const类型对象又是一个普通的int类型对象的引用。这里的常量性仅仅限制了我们能通过ip做什么。这不表明i不会变,只是对它的修改不能通过ip进行。如果我们把问题说的再详细一点,请看下面这个把const和volatile结合使用的例子:
extern const volatile time_t clock;
这个const修饰词表面我们未被允许(在代码中显示的直接的)修改ckock的值,但是同时存在volatile修饰词说明clock肯定还是会通过其他途径发生变化”②
=======================================================
注释:
①译注:也就是说变量本身不具有常量性,具有常量性的是通过指针反引用的那个能够作为左值得表达式(*ip),虽然这两者从观念上来看,是同一个对象。这就让我们理解,C++常量性不是根据低级地址绑定的,而是富有高级的对象观念的。
②译注:这个例子说明了C++中的常量性的观念只限制了在代码中对const修饰的变量显示的直接修改,对于其他方式修改,并不是C++语言的常量性的要求。总体来看本文指出了常量性是高级操作。
=======================================================
个人理解:
对于③的理解:
int &i=12;//错误,“引用必须以左值来初始化”→常见错误44:引用和临时对象
const int &i2=12;//正确,编译器会声明一个临时对象
但是不要试图通过下面的方式改变字面常量12的值:
const_cast<int &>(i2)=11;//赋值给那个匿名临时对象,或者程序直接崩溃。
=========================================================
See Also
常见错误44:引用和临时对象

posted @ 2012-09-30 17:12  zhanjindong  阅读(290)  评论(0编辑  收藏  举报
TOP