2015-03-06 23 views
7
#include <iostream> 

struct A 
{ 
    A() { std::cout << "Def Constr\n"; } 

    A(const A&) { std::cout << "Copy Constr\n"; } 
}; 

A func1() 
{ 
    return A{}; 
} 

void func2(A a) {} 

int main() 
{ 
    func2(func1()); 
} 

Dopo aver compilato conCopia Elision Incomprensione

g ++ Copy.cpp -std = C++ 11 -fno-Elide, a costruttori

output è:

Def Constr

Copia Constr

Copia Constr

E le mie domande è: perché 2 Copia Constr? Pensavo che fosse necessaria solo una copia.

Potrei supporre che func1() lanci un oggetto temporaneo e che questo oggetto temporaneo debba essere copiato in un'altra area di memoria e da quella regione di nuovo una copia deve essere fatta per il parametro func2() ma è vaga per me .

Potresti spiegarlo in dettaglio per favore?

+0

Mi chiedo come il risultato sarà diverso se func2 prende riferimento const. –

risposta

2

Sì, la tua comprensione è giusta. La vostra linea di codice (senza copiatura) è simile a

int main() 
{ 
    { 
    A temp = func1(); // 2nd copy 
    func2(temp); // 3rd copy 
    } 
} 
6
  1. Il valore di ritorno di func1 viene copiato dall'espressione A{}.
  2. Il valore della espressione di chiamata di funzione func1() viene copiato nel parametro di funzione di func2.
Problemi correlati