const int ival = 1024;
// still an error
const int *&pi_ref = &ival;If we read this definition from right to left, we discover that pi_ref is a reference to a pointer to an object of type int defined to be const. Our reference isn't to a constant but rather to a nonconstant pointer that addresses a constant object. The correct definition is as follows:const int ival = 1024;
// ok: this is accepted
const int *const &pi_ref = &ival;
请问,为什么一定要constant pointer?

解决方案 »

  1.   

    因为ival的值不可改变,而编译器无法确定指针的操作是否会改变ival的值,为了防止用户用指针是修改ival的值,所以,必须用const指针,
      

  2.   

    第一个例子中pi_ref是一个指向常数的指针,如果改变这个指针的值,他可以指向另外的地址(如一个 const int ival2 = 1023;  pi_ref =&ival2),那么*pi_ref的值也就不能保持不变了,只有象第二个例子一样,把pi_ref指向的地址本身也变成常数,才能保证 *pi_ref 是一个常数.(相当于一个传递信任的关系,你把手指向一个不变的天安门,如果你自己能转动,那么你指向的地方就不一定是一个固定的地方了)
      

  3.   

    参考了大家的回帖,也做了一些测试,小弟不才总结一下这个问题。
    核心问题是对指针的引用,核心问题又分为两种比较大的情况:
    一、被引用的指针是指针变量
        例如:
            int ival=1024;
            int *pi=&ival;
            int *&pi_ref=pi;
        pi_ref是一个引用变量,pi_ref改变,pi也随之改变,pi也就不再指向ival了。
    二、被引用的指针是指针常量
        例如:
            int ival=1024;
            int * const &pi_ref=&ival;
        在程序编译时,ival被分配空间并附值,这时&ival就是一个常量了,pi_就必须是一个引用常量。存储ival的地址无法改变,pi_refint也就无法改变了。int *只不过是修饰指针类型的。
        在这种情况下同样还有:
            const int ival=1024;
            const int * const &pi-ref=&ival;       
        不知道我说清楚了没有,fangrk(加把油,伙计!)、masterdog(掌门狗)的回帖对我帮助很大,感谢所有的回帖。详见:http://www.csdn.net/expert/topic/812/812983.xml?temp=.5125543