Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回由引用指定的引用局部变量_C++_Pass By Reference - Fatal编程技术网

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的,因为它更广泛,但你的是快速和有用的!