C++ 返回由引用指定的引用局部变量
我对这个简单的案例有点困惑:C++ 返回由引用指定的引用局部变量,c++,pass-by-reference,C++,Pass By Reference,我对这个简单的案例有点困惑: O& foo() { O& o = bar(); // sig: O& bar(); return o; } 可以吗?我很有信心,但我搜索了关于这一点的高级解释,没有任何明确的结果。有好的参考资料吗?也许我错了 编辑:bar()函数的结果是合法的(它是列表中的引用元素),并且使o变量成为静态并不是问题的一部分,我只是想确保引用指定的局部变量本身可以通过引用返回。static的语义完全不同。它取决于条返回的内容。如果它通过引用返回
O& foo() {
O& o = bar(); // sig: O& bar();
return o;
}
可以吗?我很有信心,但我搜索了关于这一点的高级解释,没有任何明确的结果。有好的参考资料吗?也许我错了
编辑:bar()函数的结果是合法的(它是列表中的引用元素),并且使o变量成为静态并不是问题的一部分,我只是想确保引用指定的局部变量本身可以通过引用返回。static的语义完全不同。它取决于
条返回的内容。如果它通过引用返回局部变量,则返回“否”。如果返回值在返回后是持久的,则返回“是”
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() {
static O o = bar();
return o; //foo will return reference to O
}
对于多线程:这将在c++11中工作您可以使用static
关键字在从返回后让对象存在。但这样做并不是在遵循面向对象的规则。
如果您返回引用以避免复制成本,则可以使用shared\u ptr
返回o
的地址,这样您就不用担心删除指针或此类问题了。
您可以找到共享ptr的工作原理。您没有返回对局部变量的引用。以下代码返回对局部变量的引用:
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();
}
@但是静态变量只能初始化onceOK,现在就可以了:现在您已经在静态变量上删除了引用类型。如果你指出了陷阱,那么你肯定会吸引更多的选票。你是说bar()
正在返回对列表元素的引用。因此,如果列表及其元素位于return
之后,那么您的答案是“Yes”;回答得很好,非常感谢。这一切都有道理。谢谢你的回答。我验证了kfsone的,因为它更广泛,但你的是快速和有用的!