【发布时间】:2013-05-02 17:55:34
【问题描述】:
在这段代码中:
#include <iostream>
using std::cout;
class Foo {
public:
Foo(): egg(0) {}
Foo(const Foo& other): egg(1) {}
int egg;
};
Foo bar() {
Foo baz;
baz.egg = 3;
return baz;
}
int main(void) {
Foo spam(bar());
cout << spam.egg;
return 0;
}
输出是3,而我预计它是1。
这意味着在Foo spam(bar()) 行中没有调用复制构造函数。
我猜这是因为bar 函数没有返回引用。
你能解释一下spam初始化时到底发生了什么吗?
如果这是一个愚蠢的问题,我提前道歉。
谢谢!
【问题讨论】:
-
你是对的......因为 baz 是一个临时的,当它离开 bar 函数的范围时会被销毁。
-
搜索返回值优化 (RVO)。这是允许 c++ 跳过调用复制构造函数的少数情况之一。
-
@John5342:谢谢!我不知道。
标签: c++ reference constructor copy-constructor return-value-optimization