我正在阅读以下问题:
(询问有关在 C++ 中返回对象的问题)
特别是以下答案:
https://stackoverflow.com/a/3350418/997112
Thing calculateThing() {
Thing thing;
// do calculations and modify thing
return thing;
}
这个答案肯定不会起作用,因为定义的变量将不再存在,因为它在堆栈上并且仅在函数持续时间内的范围内?
我正在阅读以下问题:
(询问有关在 C++ 中返回对象的问题)
特别是以下答案:
https://stackoverflow.com/a/3350418/997112
Thing calculateThing() {
Thing thing;
// do calculations and modify thing
return thing;
}
这个答案肯定不会起作用,因为定义的变量将不再存在,因为它在堆栈上并且仅在函数持续时间内的范围内?
它会起作用,因为(至少在语义上),您将变量的副本返回给调用者。现在,实际的副本可能会通过返回值优化被省略,所以在这种表达式中
Thing t = calculateThing();
来自函数体的thing
the 通常会被构造到t
. 但t
实际上是一个副本,thing
因为它具有相同的价值。
该thing
函数的内部将在返回后销毁,但它会被复制到Thing
调用方的另一个对象。
Thing new_thing = calculateThing();
new_thing
thing
具有从中返回的内容calculateThing
。
注意:有一个棘手的问题,我假设有明确定义的复制构造函数或赋值运算符new
,delete
以防Thing
.
更新:
正如 juanchopanza 评论的那样,RVO将避免thing
在该函数内创建。实际上new_thing
将被thing
隐式替换,并且不会完成额外的副本。显然不会发生破坏。
这是有效的,因为thing
它被复制/移入返回值(返回值是不同的对象,thing
除非发生复制省略,在这种情况下,生命周期thing
会延长到返回值的生命周期)。
//Here there may be up to three Thing objects.
//- `thing` in the function body
//- the unnamed temporary that is the value of `calculateThing()`
// (the return value)
//- t
Thing t(calculateThing());
如果发生复制省略,所有三个对象可能是同一个对象。