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

Why cant const references be returned in the same way as pointers?

本文关键字:方式 返回 常量 引用 不能 指针 为什么      更新时间:2023-10-16

如果我们从函数返回指针,我们可以编写

const X* f();

X* const f();

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

const X& f();
X& const f();

似乎不可能返回一个引用,您可以在其中修改 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;
} 

似乎不可能返回一个引用,您可以在其中修改 X,但不能重新分配它?

永远无法重新分配引用。它们不断引用在初始化时绑定到的相同引用。

当指针在这方面似乎很有效时,我们为什么要返回引用?

引用

用法更直观,函数的调用者可以简单地使用引用,就像变量一样,这与用户必须处理取消引用等的指针不同。

你的前两个例子不一样。你可能的意思是

const X* f();
X const* f();

实际上,您可以使用引用编写相同的内容:

const X& f();
X const& f();

声明X* const f();没有多大意义。无论如何,您都无法更改返回的指针。这只是一个值。您可以使用该值(即 f()->foo() )或存储它(即 X* copy = f(); )。如果你存储了值,那么恒常性只取决于你存储值的变量,而不是值本身。比较int x = 4; - x不会仅仅因为常数而变成常量4

更新问题:当你这样做时 TMP = TMP2;在主函数中,您不会将对 TMP2 的引用分配给 TMP。相反,您正在复制整个对象。

要看到这一点,请给出 X 复制构造函数来打印某些内容。这样的事情应该有效:

X(X& that)
{
    std::cout << "X is being copied" << std::endl;
    *this = that;
}

似乎不可能返回一个引用,您可以在其中修改 X,但不能重新分配它?

事实上。引用是变量的别名,不能重新拔插(即更改为另一个变量的别名)。

如果这确实是不可能的,那么当指针在这方面似乎很有效时,我们为什么要返回引用呢?

这与其说是效力问题,不如说是语义和责任问题。

指针:

  • 可能为
  • 可能意味着您需要获得对象的所有权(即,它是由new创建的,您必须处置它)

引用没有这些问题,因此更简单。简单是好的。因此,当您不需要指针的强大功能时,请避免自己的困境并使用引用。