Kopieren des Konstruktors wird nicht aufgerufen, wenn ein Objekt mit dem Rückgabewert einer Funktion initialisiert wird

8

Betrachten Sie den folgenden Code:

%Vor%

Die Ausgabe des obigen Codes mit g++ file.cpp ist:

%Vor%

Die Ausgabe des obigen Codes mit g++ -fno-elide-constructors file.cpp ist:

%Vor%

Ich kenne Return-Value-Optimierung. Meine Frage ist, welcher Aufruf zum Kopieren des Konstruktors ist elided (temporäres Objekt während der Rückgabe oder zurückgegebenes Objekt wird nach b) kopiert?

Wenn der elided Copy-Konstruktor derjenige ist, der für die Erstellung von b verwendet wird, wie wird b überhaupt erzeugt (weil es in diesem Fall auch keinen Konstruktoraufruf gibt)?

Wenn ich die Zeile A b = a.fun(c); durch a.fun(c) ersetze und mit der ersten Methode oder sogar der zweiten Methode kompiliere, wird auch der Kopierkonstruktor 2 Mal aufgerufen. Wenn also in dem im vorherigen Absatz erläuterten Fall der Kopierkonstruktor des temporären Objekts entfernt wird, warum wird er dann nicht entfernt?

    
crisron 14.11.2014, 19:16
quelle

2 Antworten

6
%Vor%

Erträge:

%Vor%

Also konstruiert es a , konstruiert c , kopiert c auf ein intermediate (Argument a der Funktion) und kopiert dann das Zwischenprodukt direkt in b und überspringt das typische Kopieren eines to eine Rückkehr Zwischenstufe. Dies wird noch besser demonstriert, wenn Sie den Wert übergeben (ändern Sie in A fun(const A& a) :

%Vor%

a ist konstruiert, c ist konstruiert, c wird direkt nach b kopiert, obwohl b nicht an Spaß weitergegeben wird!

    
IdeaHat 14.11.2014, 19:27
quelle
4

Die kopierte Kopie ist die Kopie des temporären Rückgabewerts in b . Ohne Elision wird der Rückgabewert von a initialisiert und nach b kopiert. Stattdessen wird das Temporary, das andernfalls den Rückgabewert enthalten würde, in b konstruiert und mit a initialisiert. [class.copy] / 31:

  

wenn ein temporäres Klassenobjekt nicht an eine Referenz gebunden wurde   (12.2) würde mit demselben in ein Klassenobjekt kopiert / verschoben werden   cv-unqualified type, kann der Kopier- / Verschiebevorgang weggelassen werden   Konstruieren des temporären Objekts direkt in das Ziel der   ausgelassen kopieren / verschieben

Sie können dies beobachten, wenn Sie eine zusätzliche Ausgabe in fun hinzufügen:

%Vor%

Dann mit der Elision erhalten Sie

  

[...]
  Spaß!   Konstruktor kopieren

Und ohne:

  

[...]
  Spaß!
  Konstruktor kopieren   Konstruktor kopieren

    
Columbo 14.11.2014 19:26
quelle