我只是创建了一个这样的类:
class GreatClass { public: GreatClass(){cout<<"Default Constructor Called!\n";} GreatClass(GreatClass &gc){cout<<"Copy Constructor Called!\n";} GreatClass(const GreatClass &gc){cout<<"Copy Constructor (CONST) Called!\n";} ~GreatClass(){cout<<"Destructor Called.\n";} GreatClass& operator=(GreatClass& gc){cout<<"Assign Operator Called!";return gc;} const GreatClass& operator=(const GreatClass& gc){cout<<"Assign Operator (CONST) Called!";return gc;} }; GreatClass f(GreatClass gc) { return gc; }
在main()函数中,有两个版本:
版本#1:
int main() { GreatClass g1; GreatClass G = f(g1); }
版本#2:
int main() { GreatClass g1; f(g1); }
Default Constructor Called! Copy Constructor Called! Copy Constructor Called! Destructor Called. Destructor Called. Destructor Called.
我不明白为什么在将f(g1)分配给G时没有发生任何事情.此时调用了什么构造函数或运算符?
谢谢.
解决方法
在某些情况下,允许编译器实现删除/删除复制构造函数调用,您指定的示例是这种情况的一个很好的示例用例.不是创建临时对象然后将其复制到目标对象,而是直接在目标对象中创建对象,并删除复制构造函数调用.
此优化称为通过Return value optimization复制省略.
此外,使用C 11 move semantics through rvalue references可能会启动而不是复制语义.即使使用移动语义,编译器仍然可以自由地应用RVO.