Ich traf einen interessanten Compilierung Fehler, wenn ein kleines Beispiel zu testen:Gibt es einen Unterschied zwischen Kopierkonstruktor/Kopierzuweisung und normaler Funktionsaufrufoptimierung beim Kompilieren?
#include <iostream>
using namespace std;
class A
{
public:
A() { cout <<"A created." <<endl; }
A(A& a) { cout <<"A created by copy constructor." <<endl; }
~A() { cout <<"A destoryed." <<endl; }
};
A CreateObject()
{
A obj;
return obj;
}
int main()
{
A a;
A b;
b= CreateObject();
return 0;
}
es einfach ist und hat keine Probleme überhaupt. es jedoch aufgefordert, bei der Zusammenstellung:
copy_constructor.cpp: In function ‘int main()’:
copy_constructor.cpp:23: error: no matching function for call to ‘A::A(A)’
copy_constructor.cpp:9: note: candidates are: A::A(A&)
es scheint, dass das Programm versucht Kopierkonstruktors aufrufen beim Kompilieren „b = Create();“ aber es gibt keinen passenden Kopierkonstruktor. das sollte nicht passieren, weil es nur eine Zuweisungsanweisung gibt, gibt es einen Unterschied zwischen Konstruktor und normaler Funktion beim Kompilieren der Optimierung?
: http://coliru.stacked-crooked.com/a/019cc3c18ba2a889. Was sind Ihre Compiler- und Kompilierungsoptionen? – Petr
Der Copy-Konstruktor sollte eine "const" -Referenz nehmen, keine modifizierbare. – Mat
Sind Sie sicher, dass Ihr realer Code nicht wirklich 'A b = CreateObject();' sagt? –