为什么不能以与指针相同的方式返回const const引用?

Fra*_*ank 0 c++ pointers

如果我们从函数返回指针,我们可以写任何一个

const X* f();
Run Code Online (Sandbox Code Playgroud)

要么

X* const f();
Run Code Online (Sandbox Code Playgroud)

,以这种方式控制是否可以重新分配指针或是否可以在内部修改类.但是当返回引用时,这两个似乎具有相同的含义:

const X& f();
X& const f();
Run Code Online (Sandbox Code Playgroud)

似乎不可能返回一个你可以修改X的引用,但不能重新分配它?如果它确实不可能,为什么我们应该在指针在这个区域看起来有效时返回引用?

更新:正如已经指出的那样,不能重新分配引用.然而,这让我更加困惑,因为下面的代码打印33 55,而不是33 33,正如我所料.如何匹配该引用无法重新分配?

struct X
{
   X(int i_) { i = i_;} 
   int i;
};

struct Y
{
    X& get2() {tmp2 = new X(55); return *tmp2;} 
    X& get() {tmp = new X(33); return *tmp;}    
    void print () {cout << tmp->i << endl;}
    X* tmp;
    X* tmp2;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Y y;    
    X& tmp2 = y.get2();
    X& tmp = y.get();       
    y.print();
    tmp = tmp2;
    y.print();
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 10

似乎不可能返回一个你可以修改X的引用,但不能重新分配它?

永远不能重新分配参考文献.他们在初始化时不断引用它们所绑定的相同指示物.

当指针在这个区域看起来有效时,为什么我们应该返回引用呢?

参考用法更直观,函数调用者可以像引用一样使用引用,而不像用户必须处理解除引用等的指针.

  • 通过指针返回引用的另一个好理由是它将指向有效的对象/函数,因为不允许空引用(在合理的C++中).因此,调用代码不必处理NULL情况,并且可以避免解除引用NULL指针等问题.当然,如果你的调用代码先验地知道该函数永远不会返回NULL指针,那么它不需要担心NULL情况,但是,使用引用而不是明确地"记录"这个保证. (4认同)