#include <iostream>
using namespace std;
class X {
public:
X() {
cout<<"Cons"<<endl;
}
X(const X& x){
cout<<"Copy"<<endl;
}
void operator=(const X& x){
cout<<"Assignment called";
}
};
X& fun() {
X s;
return s;
}
int main(){
X s = fun();
return 0;
}
Этот код также вызывает конструктор копирования. Почему это работает? Я помню, что когда я впервые запустил эту программу, она ошиблась. Но через некоторое время он начал называть эту копию минусами. и теперь работает!! странный.
Но если я заменю fun() следующим образом:
X fun() {
X s;
return s;
}
Затем скопируйте минусы. не называется. Я думал, что у копии минусы. будет вызван в этом случае. Но, как указал @flyfishr64, здесь в игру вступает RVO. Но это все еще не объясняет случай, когда я возвращаю ссылку. Я думаю, что это всегда должно segfault.
Любые объяснения?