我正在阅读以下问题:
How to "return an object" in C++?
(询问在C ++中返回对象)
特别是以下答案:
https://stackoverflow.com/a/3350418/997112
Thing calculateThing() {
Thing thing;
// do calculations and modify thing
return thing;
}
肯定这个答案不会起作用,因为定义的变量将不再存在,因为它在堆栈上并且仅在函数持续时间的范围内?
答案 0 :(得分:1)
它会起作用,因为(至少在语义上),您将向变量调用者返回变量的副本。现在,实际副本可能会通过return value optimization省略,所以在这种表达方式中
Thing t = calculateThing();
函数体中的thing
通常会被构造到t
的位置。但t
实际上是thing
的副本,因为它具有相同的价值。
答案 1 :(得分:1)
该函数内的thing
将在返回后销毁,但会被复制到调用方的另一个Thing
对象。
Thing new_thing = calculateThing();
new_thing
包含thing
返回的calculateThing
内容。
注意:有一个棘手的问题,我假设有明确定义的复制构造函数或赋值运算符,以防new
中有delete
/ Thing
个东西的
<强>更新强>
正如juanchopanza评论的那样,RVO将避免在该函数内创建thing
。实际上,new_thing
将被thing
隐式替换,并且不会执行额外的复制。显然不会发生破坏。
答案 2 :(得分:0)
这是有效的,因为thing
被复制/移入返回值(返回值是与thing
不同的对象,除非发生复制省略,在这种情况下{{1}的生命周期}被扩展到返回值的生命周期。)
thing
如果发生复制省略,则所有三个对象可能是同一个对象。