可能重复:
Why copy constructor is not called in this case?
What are copy elision and return value optimization?
有人可以向我解释为什么以下程序产生输出“cpy:0”(至少在使用g ++ 4.5.2编译时):
#include<iostream>
struct A {
bool cpy;
A() : cpy (false) {
}
A (const A & a) : cpy (true) {
}
A (A && a) : cpy (true) {
};
};
A returnA () { return A (); }
int main() {
A a ( returnA () );
std::cerr << "cpy: " << a.cpy << "\n";
}
当我试图弄清楚这个例子看似奇怪的结果时出现了问题:move ctor of class with a constant data member or a reference member
答案 0 :(得分:6)
编译器可以自由地复制和移动构造,即使它们具有副作用,也可以代表它自己创建的对象。临时对象和返回值通常直接构造在正确的位置,不会复制或移动它们。但是,对于返回值,您需要小心谨慎才能获得省略。
如果你想防止复制省略,你基本上需要有条件地返回两个候选对象:
bool flag(false);
A f() {
A a;
return flag? A(): a;
}
假设您没有更改flag
,这将始终创建a
的副本(除非我上次尝试后编译器变得更聪明)。