关于引用定义的两种特殊情况

所有引用的类型都要和与之绑定的对象严格匹配。而且,引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起,但有两种情况例外:

第一种例外情况就是,在初始化常量引用时允许用任意表达式作为初值,只要该表达式的计算结果能转换成引用类型即可,尤其允许一个常量引用绑定非常量对象、字面值甚至是一般表达式:

eg:  int i = 42;

       const int &r1 = i;           //允许将const  int  &绑定到一个普通的int 对象上

       const int &r2 = 42;       //正确:r1是一个常量引用

       const int &r3 = r1*r2;  //正确:r3是一个常量引用

       int  &r4 = r1*r2;      //错误:r4是一个普通的非常量引用

要想理解上述例外情况的原因,最简单的办法是弄清楚当一个常量引用被绑定到另外一种类型上时到底发生了什么:

eg: double   dval = 3.14;

          const  int  &ri  =  dval;

上述代码对应的汇编代码:(该汇编代码,由VS2010生成)

 

由上述汇编代码可以看出,双精度浮点数生成了一个临时变量,让 ri 绑定这个临时变量。

 

如果ri 不是常量时。如果执行了类似于上面的初始化过程将带来什么样的后果。如果ri不是常量,就允许对ri 赋值,这样就会改变ri 所引用对象的值。注意,此时绑定的对象时一个临时量而非dval。程序员既然让 ri 引用dval ,就肯定想通过 ri 改变dval 的值,否则干什么要给ri 赋值呢?如此看来,既然大家基本上不会想着把引用绑定到临时量上,C++语言也就吧这种行为归为非法。

 

 关于另一种例外情况:类型转换与继承时的const 引用,在接下来的学习中,进行补充

posted on 2014-04-28 11:01  huyeshanlu  阅读(185)  评论(0)    收藏  举报