【发布时间】:2012-06-10 11:50:36
【问题描述】:
如果我有一个类 A(它通过值返回一个对象),并且两个函数 f() 和 g() 仅在它们的返回变量上有所不同:
class A
{
public:
A () { cout<<"constructor, "; }
A (const A& ) { cout<<"copy-constructor, "; }
A& operator = (const A& ) { cout<<"assignment, "; }
~A () { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
现在当我执行A b = f(a); 行时,它会输出:
copy-constructor, constructor, f, destructor,假设 f() 中的对象 y 直接在目标(即对象 b 的内存位置)创建,并且不涉及临时对象,这很好。
当我执行A c = g(a); 行时,它输出:
copy-constructor, constructor, g, copy-constructor, destructor, destructor,.
所以问题是为什么在 g() 的情况下不能直接在 c 的内存位置创建对象,就像调用 f() 时发生的那样?为什么它在第二种情况下调用一个额外的复制构造函数(我认为是因为临时的参与)?
【问题讨论】:
-
如果您希望编译器执行优化,那么您必须在启用优化的情况下进行编译。
-
我认为这与编译器优化无关,因为我已经尝试过了。
标签: c++ temporary return-by-value