我有以下代码:
#include <iostream>
using namespace std;
class X
{
public:
int g;
X() { cout << "constr" << endl; }
X(const X& ref1) { cout << "copy constr" << endl; }
};
X f()
{
X ee;
ee.g = 1;
return ee;
}
int main()
{
X ff = f();
return 0;
}
运行代码我看到构造函数只被调用一次,从未调用过复制构造函数。你不期望这里有两个构造函数和一个复制构造函数调用吗?谢谢!
答案 0 :(得分:1)
这是名为copy elision的return value optimization的一个特例(该链接正好解释了您的情况)。
答案 1 :(得分:0)
复制Elision 是许多编译器实施的优化,以防止额外的,不必要的副本。在实践中可以实现按值返回或按值传递。
请查看以下答案中的示例:https://stackoverflow.com/a/12953129/1938163
struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};
C f() {
return C();
}
int main() {
std::cout << "Hello World!\n";
C obj = f();
}
(http://en.wikipedia.org/wiki/Return_value_optimization#Summary)
第一次相信可能不可思议,具体取决于编译器和放大器。设置,以下输出均有效:
Hello World!
A copy was made.
A copy was made.
Hello World!
A copy was made.
Hello World!
在您的情况下,这是一个名为RVO - Return Value Optimization的特殊复制省略优化,其中通过方法的值返回的对象的副本已被删除。