C ++通过引用返回本地对象[重复]
Posted
技术标签:
【中文标题】C ++通过引用返回本地对象[重复]【英文标题】:C++ return a local object by reference [duplicate] 【发布时间】: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
之前完全返回并清除它的变量。
不,因为对象在函数返回之前被销毁,而在函数返回之前无法完成。
另一个问题是问完全相同的事情 - 再次检查。它询问为什么不能返回引用,而你说'但是如果我确实返回它,我能用它做什么?
【参考方案1】:
不,正如你自己所说,这不安全。
无论您如何处理对现在已销毁对象的无效引用,这都是正确的。
复制太晚了。
【讨论】:
所以我不能在对象消失之前说“保存”它吗? @Luca 是的,您可以通过返回值而不是引用来实现。这几乎就是按价值返回的意思。 这正是按值返回的意思。 @Luca:如果你担心的是多余的复制。不要这样。编译器支持您。 ***.com/questions/12953127/…以上是关于C ++通过引用返回本地对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章