struct CAT
{
CAT(){cout<<"CAT()"<<endl;}
CAT(const CAT& ){cout<<"CAT(const CAT&)"<<endl;}
CAT(CAT&& ){cout<<"CAT(CAT &&)"<<endl;}
void speak(){cout<<"speak()"<<endl;}
};
CAT f()
{
CAT local_c;
return local_c;
}
int main()
{
CAT c = f();
c.speak();
}
我使用-fno-elide-constructors
编译代码来禁用g ++的返回值优化,因此我们可以观察代码中的所有操作。
这是输出:
CAT()
CAT(CAT &&)
CAT(CAT &&)
speak()
令我困惑的是第一个输出&#34; CAT(CAT&amp;&amp;)&#34;。我的理解是local_c
是左值,所以当编译器创建内部临时CAT
对象时,它应该使用CAT(const CAT&)
而不是CAT(CAT&&)
,对吧?