den folgenden Code vor:Copy-Konstruktor nicht aufgerufen, wenn ein Objekt mit Rückgabewert einer Funktion initialisiert
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a = b.a;
cout << "Copy Constructor\n";
}
A fun(A a)
{
return a;
}
};
int main()
{
A a, c;
A b = a.fun(c);
return 0;
}
Die Ausgabe des obigen Codes mit g++ file.cpp
ist:
Constructor
Constructor
Copy Constructor
Copy Constructor
Der Ausgang des obige Code mit g++ -fno-elide-constructors file.cpp
ist:
Constructor
Constructor
Copy Constructor
Copy Constructor
Copy Constructor
ich weiß Rückgabewert Optimiz aktion. Meine Frage ist, welcher Aufruf zum Kopieren Konstruktor ist elided (temporäres Objekt während der Rückgabe oder zurückgegebenes Objekt kopiert nach b)?
Wenn der elided Copy-Konstruktor derjenige ist, der zum Erstellen von b verwendet wird, wie wird b überhaupt erstellt (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, dann 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?
Wie ich Ich habe dieses Zeug untersucht, als ich davon lernte. Alles war 'std :: cout <<" Konstruktor kopieren: "<< (void *) b <<" to "<< (void *) Dieses << std :: endl;' und 'std :: cout <<" Konstruieren "<< (void *) dieses << std :: endl' Bonuspunkte, wenn Sie Züge in C++ 11 hinzufügen. – IdeaHat