C++ 通过引用返回本地对象 [duplicate]

C++ return a local object by reference [duplicate]

提问人:Luca 提问时间:5/3/2017 最后编辑:Luca 更新时间:5/3/2017 访问量:1849

问:

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

如果我有这样的函数:

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

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

Object newObject = function();

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

Object &temp = obj;
Object newObject = temp;

?请解释。

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

C++ 逐个引用 传递值

评论

2赞 François Andrieux 5/3/2017
区别在于第二个示例中,当您创建 .在第一个示例中,在创建 .该函数在将结果分配给 之前完全返回并清除其变量。objnewObjectobjnewObjectnewObject
0赞 Jan Hudec 5/3/2017
不可以,因为对象在函数返回之前就被销毁了,而在函数返回之前无法完成。
0赞 EML 5/3/2017
另一个问题是问完全相同的事情 - 再检查一次。它问为什么不能返回引用,而您说“但是如果我确实返回了它,我可以用它做什么”?

答:

2赞 Lightness Races in Orbit 5/3/2017 #1

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

无论您对现在无效的对现已销毁的对象的引用执行什么操作,都是如此。

复制为时已晚。

评论

0赞 Luca 5/3/2017
所以我不能说在对象消失之前“保存”它?
1赞 Angew is no longer proud of SO 5/3/2017
@Luca 是的,您可以通过返回值而不是引用来获得。这几乎就是按价值返回的意思。
0赞 Lightness Races in Orbit 5/3/2017
这正是按值返回的意义。
2赞 Benjamin Lindley 5/3/2017
@Luca:如果你担心的是多余的复制。别这样。编译器是你的坚强后盾。stackoverflow.com/questions/12953127/......