返回由引用指定的引用局部变量

Returning a reference local variable assigned by reference

本文关键字:引用 局部变量 返回      更新时间:2023-10-16

我对这个简单的案例有点困惑:

O& foo() { 
O& o = bar(); // sig: O& bar();
return o; 
}

可以吗?我很有信心,但我搜索了关于这一点的高级解释,没有出现任何明确的结果。有什么好的推荐信吗?或者我只是错了?

EDIT:bar()函数的结果是合法的(它是列表中的引用元素),使o变量静态并不是问题的一部分,我只是想确保通过引用分配的局部变量本身可以通过引用返回。static的语义完全不同。

这取决于bar返回的内容。如果它通过引用返回一个局部变量,则为no。如果返回值在返回后是持久的,则为yes。

O& bar() {
static O o;
return o;
}
O& bar1() { 
return O();  // temporary
}
O& foo() { 
O& o = bar();   // okay
O& o1 = bar1(); // not okay
return o; 
}

您不会返回对局部变量的引用。以下代码返回对本地变量的引用:

O& foo() {
O o;
return o;
}

在您的代码中,"o"已经是一个引用。它不是通过引用分配的变量,它引用。

函数还返回一个引用,这意味着您将引用传递回,而不是对引用的引用。简单地说:您的函数只是返回一个引用。让我们来充实一下:

struct O {};
static O s_o;
O& foo() { return s_o; } // returns a reference, to s_o
O& bar() {
O& o = foo(); // os now refers to s_o;
return o; // o is a reference, but it refers to s_o,
// so this returns a reference to s_o, not o.
// we're returning "O&", not "(O&)&".
}

这基本上与以下内容相同:

O* bar(); // returns a pointer to X.
O* optr = bar(); // optr points to X.
return optr; // returns the address of x.

我们在这里不返回指向"optr"的指针,而是返回optr包含的值,该值是指向"O"实例的指针。

在C++中,引用通常被实现为指针之上的契约层——也就是说,引用的底层类型通常是指针。合同交易对指针的访问权,从而改变参考点/引用内容的能力,以换取一定程度的保证,即它将引用/指向具体实例。有一些方法你仍然可以用参照物射中自己的脚,尤其是在参照指针的目标时。

那么,从调用者的角度来看,对代码进行最简单的简化也有同样的效果:

O& foo() {
return bar();
}

您可以使用static关键字让您的对象在从返回后存在。但这样你就不会遵循对象定向的规则
如果您要返回引用以避免复制成本,您可以使用shared_ptr<O>,通过它您将返回o的地址,并且您不必担心删除指针或此类问题
在这里您可以找到shared_ptr的工作原理。

您可以使static对象返回单线程应用程序的局部变量:

O& foo() { 
static O o = bar();
return o; //foo will return reference to O
}

对于多线程:这将在c++11 中工作