返回通过引用分配的引用局部变量

时间:2014-02-25 10:44:49

标签: c++ pass-by-reference

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

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

可以吗?我非常有信心,但我搜索了关于此的高级解释,并没有任何明确的突然出现。有什么好的参考?或许我错了?

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

4 个答案:

答案 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中运行