Il compilatore C++ sintetizza il costruttore di copie predefinito nella seguente situazione. (Da Inside C++ Object Model)
- Quando la classe contiene un oggetto membro di una classe per la quale esiste un costruttore di copie.
- Quando la classe è derivata da una classe base per la quale esiste un costruttore di copie.
- Quando la classe dichiara una o più funzioni virtuali
- Quando la classe è derivata da una catena di ereditarietà in cui una o più classi di base sono virtuali.
Possiamo vedere che la classe A non è nelle 4 situazioni. Quindi cl non sintetizzare il costruttore di copie predefinito per questo. Forse è per questo che 2 oggetti temporanei vengono costruiti e distrutti.
Dalla finestra disassiale, possiamo vedere il seguente codice, non A :: A chiamato.:
B b;
00B317F8 lea ecx,[b]
00B317FB call B::B (0B31650h)
00B31800 mov dword ptr [ebp-4],0
func(b);
00B31807 mov al,byte ptr [ebp-12h]
00B3180A mov byte ptr [ebp-13h],al
00B3180D mov byte ptr [ebp-4],1
00B31811 movzx ecx,byte ptr [ebp-13h]
00B31815 push ecx
00B31816 call func (0B31730h)
Ma se rendiamo virtuale il distruttore. Otterremo il seguente codice di disassemblaggio, possiamo vedere che A :: A è chiamato. Quindi il risultato è come previsto, solo 1 oggetto creato.
B b;
00331898 lea ecx,[b]
0033189B call B::B (03316A0h)
003318A0 mov dword ptr [ebp-4],0
func(b);
003318A7 push ecx
003318A8 mov ecx,esp
003318AA mov dword ptr [ebp-1Ch],esp
003318AD lea eax,[b]
003318B0 push eax
003318B1 call A::A (0331900h)
003318B6 mov dword ptr [ebp-20h],eax
003318B9 call func (03317D0h)
testato su VS2010, il risultato è "132.242" – Apokal
Clang 4.1 produce "13242" –
versione VS produrre solo 13.242 ma non versione di debug – billz