Default-Konstruktor mit leeren Klammern
Gibt es irgendeinen guten Grund, die leere Runde Klammern (Klammern) ist nicht gültig für den Aufruf der Standard-Konstruktor in C++?
MyObject object; //ok - default ctor
MyObject object(blah); //ok
MyObject object(); //error
Mir scheint Sie zu geben "()" automatisch jedes mal. Gibt es einen guten Grund, warum dies nicht erlaubt ist?
Sollte jemand einen besseren Titel für dieses, aber ich kann mir nicht denken, was das wäre. Zumindest buchstabieren "Konstruktor" zu helfen, die Suchmaschine(N).
Und dies ist nur ein weiteres gutes Beispiel wo C++ ist Kontext-Sensitiv. Der Beispiel-code in die Frage wäre auch fehl, wenn
Und dies ist nur ein weiteres gutes Beispiel wo C++ ist Kontext-Sensitiv. Der Beispiel-code in die Frage wäre auch fehl, wenn
blah
wäre Klasse.InformationsquelleAutor Martin Beckett | 2008-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Most vexing parse
Dies ist im Zusammenhang zu dem, was ist bekannt als "C++'s most vexing parse". Im Grunde, alles, was vom compiler interpretiert werden als Funktionsdeklaration interpretiert werden, als eine Funktion Erklärung.
Einer anderen Instanz des gleichen Problems:
v
interpretiert wird, als Erklärung der Funktion mit 2 Parametern.Ist die Problemumgehung fügen Sie ein weiteres paar von Klammern:
Oder, wenn Sie C++11 und Liste-Initialisierung (auch bekannt als die einheitliche Initialisierung) zur Verfügung:
Mit dabei, es gibt keinen Weg, es könnte interpretiert werden als eine Funktion Erklärung.
extern "C" foo();
-Stil ist auch erlaubt in C++.Wie kann das interpretiert werden, als eine Funktion?
zurück geben;
v
ist der name der Funktion;(
öffnet formale Argumentliste;std::istream_iterator
ist der Typ des ersten Arguments;ifs
ist der name des ersten Arguments,()
umifs
werden, werden effektiv ignoriert; zweitensstd::istream_iterator
ist der Typ des zweiten Arguments, das ist Unbenannt,()
um ihn herum werden ebenfalls ignoriert; ');' schließt argument-Liste und Funktion Erklärung.die Klammern nach dem zweiten argument nicht ignoriert. Der zweite parameter ist nicht ein
std::istream_iterator
aber einen Zeiger/Referenz auf eine Funktion, die nimmt keine Argumente und gibt einenistream_iterator
.Nein, das ist nicht die meisten vexing parse!!! Die anderen Fälle, die Sie identifizieren .
InformationsquelleAutor Constantin
Weil Sie die behandelt, wie die Deklaration für eine Funktion:
Sehr klare und einfache Antwort! Sofort war ich in der Lage, es zu verstehen!
InformationsquelleAutor 1800 INFORMATION
Dem gleichen syntax für die Funktion Erklärung - Z. B. die Funktion
object
, ohne Parameter und die RückgabeMyObject
InformationsquelleAutor Nemanja Trifunovic
Weil der compiler denkt, es ist eine Deklaration einer Funktion nimmt keine Argumente und gibt ein Beispiel MyObject.
InformationsquelleAutor Fred Larson
Denke ich, würde der compiler nicht wissen, ob diese Aussage:
ist ein Konstruktor-Aufruf oder ein Funktionsprototyp deklarieren eine Funktion mit dem Namen Objekt mit Rückgabetyp MyObject und keine Parameter.
InformationsquelleAutor Black
Können Sie auch die ausführlichere Art der Konstruktion:
In C++0x dies ermöglicht auch
auto
:Der compiler ist wahrscheinlich klug genug, um zu verwenden einige
RVO
-wie Optimierung verhindern, dass es ineffizient ist."Wahrscheinlich" heißt "ich vermute". Zur Optimierung der Regel Menschen wollen nicht zu erraten, sondern das explizite Art und Weise.
Sie brauchen nicht zu "erraten"; copy-elision wird auch hier passieren in allen mainstream-Compiler und das ist der Fall für gut über einem Jahrzehnt. Nicht, dass dies ist guter code.
seit C++11 hier verwendet wird move assignment operator, welcher ist schneller für Klassen, holding resourses auf heap.
InformationsquelleAutor dalle
Wie bereits erwähnt, viele Male, es ist eine Erklärung. Es ist auf diese Weise für die Abwärtskompatibilität. Einer der vielen Bereiche von C++, die sind doof/inkonsistente/schmerzhaft/falsch, weil der das Erbe.
InformationsquelleAutor Michael Burr
Vom n4296 [dcl.init]:
InformationsquelleAutor Andreas DM
Als der andere sagte, es ist eine Funktionsdeklaration. Seit C++11 können Sie brace-Initialisierung wenn Sie brauchen, um zu sehen, die leeren etwas, die explizit sagt Sie, dass ein default-Konstruktor verwendet wird.
InformationsquelleAutor Hitokage