返回由引用指定的引用局部变量
Returning a reference local variable assigned by reference
我对这个简单的案例有点困惑:
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 中工作
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 返回对局部变量 - C++ 的引用
- 警告 C4101 未引用的局部变量
- 现代编译器会优化只引用对象子集的局部变量吗
- 右值引用和局部变量的移动
- 结构数组 - 未引用的局部变量
- 返回对局部变量的引用是否正常工作?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 变量循环范围会导致返回局部变量的地址引用
- 通过引用返回局部变量
- 为什么我得到未引用的局部变量
- 返回由引用指定的引用局部变量
- 返回静态局部变量作为引用
- 从函数中引用局部变量不会给出错误
- C++按引用局部变量传递
- 为什么可以通过引用局部变量而不是临时变量来返回函数?c++
- 捕获带有未引用局部变量警告的异常
- c++11时间非引用局部变量