Dlaczego nie jest wołany konstruktor kopiujący

0

Witam

Pytanie: dlaczego przy pierwszym przypisaniu do k1 nie jest wołany konstruktor kopiujący?

KlasaTest1 makeKlasaTest1(){
	return KlasaTest1(11);//konstruktor z parametrem int
}

KlasaTest1 k1 = makeKlasaTest1();//Konstruktor z parametrem wewnątrz funkcji 
KlasaTest1 k2 = k1;//konstruktor kopiujący
k1 = makeKlasaTest1();//operator przypisania

Układam sobie filozofię, że jeżel mamy osierocony obiekt tymczasowy to nie ma sensu go kopiować konstruktorem kopiującym, tylko staje sie on obiektem k1.

Co ciekawe jeśli zmodyfikuję funkcję następująco:

KlasaTest1& makeKlasaTest1(){
	KlasaTest1 *k = new KlasaTest1(11);
	return (*k);
}

to najpierw w metodidze jest wołany konstruktor z parametrem int, a później przy przypisaniu

KlasaTest1 k1 = makeKlasaTest1();

już jest wołany konstruktor kopiujący, bo zwracana jest referencja, a referencja nie jest z definicji osierocona.

Tylko powyższa filozofia troche mi wygląda na naciąganą. Mało profesjonalną. Będę wdzięczny jak sie ktoś wypowie na ten temat.

2

Jest dokładnie tak, i do tego od C++17 taka optymalizacja przestała być dopuszczalna a stała się obowiązkowa. Słowa-klucze dla google: copy elision, RVO, NRVO.

2

Pytanie: dlaczego przy pierwszym przypisaniu do k1 nie jest wołany konstruktor kopiujący?
RVO, copy elision. Dobra wola kompilatora czy wykona taką optymalizację czy nie (od C++17 copy elision chyba będzie wymagane). W drugim Twoim kodzie takiej optymalizacji nie wykonał. I już.

1 użytkowników online, w tym zalogowanych: 0, gości: 1