【问题标题】:C++ return a local object by reference [duplicate]C ++通过引用返回本地对象[重复]
【发布时间】:2017-10-01 09:53:22
【问题描述】:

我知道这个问题已经被问了好几(百万)次了,但我不明白接下来的内容:

如果我有这样的功能:

Object &function()
{
    Object obj;
    return obj;
}

以及调用它的客户端代码:

Object newObject = function();

我通过引用含义返回 obj ,这很糟糕,因为该对象一旦超出范围就会被销毁(在终止大括号之后)。但是我将该本地对象传递给调用站点的新对象,所以我不应该安全吗?当对象消失时,不应该(通过其复制构造函数)复制对象吗?我知道将指针传递给非本地对象是不好的,因为我正在传递(按值)指针的位置,一旦(本地)指针超出范围(堆栈帧消失),该位置将指向垃圾,但是为什么引用?代码不一样吗:

Object &temp = obj;
Object newObject = temp;

?请解释一下。

编辑上面的问题不是问同样的事情。我完全理解为什么我不应该返回指向本地的指针,以及为什么我不应该返回对本地的引用来初始化调用站点的引用。我不明白为什么我不能使用对本地的引用来初始化调用站点的对象。我觉得没那么简单。

【问题讨论】:

  • 区别在于第二个例子,obj在你创建newObject时仍然存在。在第一个示例中,obj 在您创建 newObject 之前已停止存在。该函数在结果分配给newObject之前完全返回并清除它的变量。
  • 不,因为对象在函数返回之前被销毁,而在函数返回之前无法完成。
  • 另一个问题是问完全相同的事情 - 再次检查。它询问为什么不能返回引用,而你说'但是如果我确实返回它,我能用它做什么?

标签: c++ reference pass-by-reference pass-by-value


【解决方案1】:

不,正如你自己所说,这不安全。

无论您如何处理对现在已销毁对象的无效引用,这都是正确的。

复制太晚了。

【讨论】:

  • 所以我不能在对象消失之前说“保存”它吗?
  • @Luca 是的,您可以通过返回值而不是引用来实现。这几乎就是按价值返回的意思。
  • 这正是按值返回的意思。
  • @Luca:如果你担心的是多余的复制。不要这样。编译器支持您。 stackoverflow.com/questions/12953127/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
相关资源
最近更新 更多