我对这个简单的案例感到有点困惑:
O& foo() {
O& o = bar(); // sig: O& bar();
return o;
}
可以吗?我非常有信心,但我搜索了关于此的高级解释,并没有任何明确的突然出现。有什么好的参考?或许我错了?
编辑:bar()函数的结果是合法的(它是列表中的引用元素),并且使o变量静态不是问题的真正部分,我只是想确保一个局部变量由引用本身可以通过引用返回。 static的语义完全不同。答案 0 :(得分:3)
这取决于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;
}
答案 1 :(得分:0)
您可以使用static
关键字让对象在返回后存在。但是这样你就不会遵循面向对象的规则了
如果您要返回参考以避免复制费用,则可以使用shared_ptr<O>
来返回o
的地址,并且不必担心删除指针或此类问题。
Here您可以找到shared_ptr的工作原理。
答案 2 :(得分:0)
您没有返回对局部变量的引用。以下代码返回对局部变量的引用:
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();
}
答案 3 :(得分:-1)
您可以使static
对象返回单线程应用程序的局部变量:
O& foo() {
static O o = bar();
return o; //foo will return reference to O
}
对于多线程:这将在c ++ 11中运行