返回值的主要目的就是为了消除由于调用copy constructor而导致的开销。
如果你没有显示提供copy constructor,那么编译器就会为你自动合成一个,但是编译器很可能会认为自己合成的这个copy constructor是trivial的(也就是几乎什么都不做),也就是说调用这个自己合成的copy constructor并没有什么额外的性能开销,所以此时编译器不会执行返回值优化。但是如果你显示提供了一个copy construtor,那么编译器就认为这个copy constructor肯定会做一些实际的事情(可能实际上你也没做什么),进而会导致一定的开销,所以它会打开返回值优化的功能,将临时对象优化掉。
所以,你可以把“自己定义copy constructor”当成打开编译器返回值优化功能的“开关”。