2017-04-14 2 views
1

Ich arbeite durch Kapitel 18 von Stroustrups Prinzipien und Praxis und stehe auf einem Teil, der mit Kopierern zusammenhängt.Wann wird ein Kopierkonstruktor in C++ aufgerufen? - Funktionsrückgabe

Ich habe eine Kopie Konstruktor wie folgt definiert:

X(const X& x) { 
    out("X(X&)"); 
    val = x.val; 
} 

X eine Struktur ist. val ist nur ein int Wert von X 'out' ist:

void out(const string& s) { 
    cerr << this << "->" << s << ": " << val << "\n"; 
} 

Ich habe auch die folgenden zwei Funktionen definiert:

X copy(X a) { 
    return a; 
} 

und

X copy2(X a) { 
    X aa = a; 
    return aa; 
} 

In Haupt-I haben:

X loc(4); 
X loc2 = loc; 
loc2 = copy(loc); 
loc2 = copy2(loc); 

Wenn ich nur copy aufruft, wird der Kopierkonstruktor zweimal aufgerufen: einmal für den Parameterbereich von copy und einmal für den Rückruf. Das macht für mich Sinn.

Wenn ich jedoch copy2 aufrufe, wird der Kopierkonstruktor nur noch zweimal aufgerufen: einmal für das Funktionsargument und einmal für 'X aa = a'. Warum ist es nicht auch für die Rückkehr erforderlich?

Antwort

2

Es gibt keine Garantie, dass Kopierkonstrukte in C++ aufgerufen werden. Im Falle einer Rückkehr wird es wahrscheinlich durch eine Bewegung ersetzt oder komplett elide.

Siehe auch: What are copy elision and return value optimization?

+0

Der Link ist sehr hilfreich, danke Tatsuyuki –

Verwandte Themen