复制构造函数何时开始工作?

IAm*_*ake 3 c++

#include <iostream>
using namespace std;
class myclass {
public:
     myclass();
     myclass(const myclass &o);
     myclass f();
};
myclass:: myclass(){
    cout<<"Constructing normally"<<endl;
};
myclass:: myclass(const myclass &o){
    cout<<"Constructing copy"<<endl;
};
myclass myclass::f(){
    myclass temp;
    return temp;
};
int main(){
   myclass obj;
   obj = obj.f();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在一本书中找到了这个例子,该书显示该程序的输出应该是:

Constructing normally
Constructing normally
Constructing copy 
Run Code Online (Sandbox Code Playgroud)

但是当我在我的编译器中编译它时,它只显示下面写的输出

Constructing normally
Constructing normally
Run Code Online (Sandbox Code Playgroud)

里面究竟发生了什么?

Bat*_*eba 11

你的构造函数有副作用 - 即cout调用.因此编译器无法优化所采用的副本obj = obj.f();.

但是C++标准确实允许它优化所采用的深层拷贝

myclass myclass::f(){
    myclass temp;
    return temp;
};
Run Code Online (Sandbox Code Playgroud)

尽管有副作用.这种允许的策略称为命名返回值优化.

可悲的是,你的书从一开始就非常过时,或者事实上是不正确的!在即将到来的冬天照亮那些舒适的火焰时,你可以用它来点燃它.