Wenn ich kompilieren (unter G ++) und den folgenden Code ausführen, druckt es "Foo :: Foo (int)". Nachdem jedoch der Kopierkonstruktor und die Zuweisungsoperatoren privat gemacht wurden, kann die Datei nicht mit dem folgenden Fehler kompiliert werden: "Fehler: 'Foo :: Foo (const Foo &)' ist privat". Wie kommt es, dass es einen Kopierkonstruktor benötigt, wenn er zur Laufzeit nur den Standardkonstruktor aufruft?Konstruktor Zugriffsregeln
#include <iostream>
using namespace std;
struct Foo {
Foo(int x) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo& operator=(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
};
int main() {
Foo f = Foo(3);
}
Wenn Sie behaupten, dass es den Kopierkonstruktor verwendet, warum sehen Sie es nicht in der Ausgabe. Das Originalplakat hat eindeutig gesagt, dass nur :: Foo (int) aufgerufen wird. – KIV
@Neil, aber der Copy-Konstruktor macht offensichtlich etwas, also scheint es unwahrscheinlich, dass der Compiler es optimieren würde ... –
@Matthew: Nein. Der Standard erlaubt explizit, dass solche Aufrufe weg optimiert werden, so dass der Compiler einfach keine interessiert Nebenwirkungen. Jeder moderne Compiler, der es wert ist, * optimiert diesen Aufruf. Auf der anderen Seite sagt der Standard auch klar, dass der Anruf immer noch möglich sein muss. Somit ist Neils Erklärung richtig und treffend. –