Ole*_*leg 7 c++ copy-elision c++11
#include <iostream>
struct A
{
A() { std::cout << "Def Constr\n"; }
A(const A&) { std::cout << "Copy Constr\n"; }
};
A func1()
{
return A{};
}
void func2(A a) {}
int main()
{
func2(func1());
}
Run Code Online (Sandbox Code Playgroud)
编译完成后
g ++ Copy.cpp -std = c ++ 11 -fno-elide-constructors
输出是:
Def Constr
复制Constr
复制Constr
我的问题是:为什么2复制Constr?我以为只需要1份复印件.
我可能猜测func1()会抛出一个临时对象,并且需要将此临时对象复制到另一个内存区域,并且必须再次从该区域为func2()参数创建一个副本,但它对我来说是模糊的.
你能详细解释一下吗?
是的,你的理解是正确的。您的代码行(没有复制省略)类似于
int main()
{
{
A temp = func1(); // 2nd copy
func2(temp); // 3rd copy
}
}
Run Code Online (Sandbox Code Playgroud)