
Martin Beckett
Gibt es einen guten Grund dafür, dass ein leerer Satz runder Klammern (Klammern) für den Aufruf des Standardkonstruktors in C++ nicht gültig ist?
MyObject object; // ok - default ctor
MyObject object(blah); // ok
MyObject object(); // error
Ich scheine jedes Mal automatisch “()” einzugeben. Gibt es einen guten Grund, warum das nicht erlaubt ist?

Konstantin
Die ärgerlichste Analyse
Dies hängt mit dem zusammen, was als “der ärgerlichste Parse von C++” bekannt ist. Grundsätzlich wird alles, was vom Compiler als Funktionsdeklaration interpretiert werden kann, als Funktionsdeklaration interpretiert.
Ein weiterer Fall des gleichen Problems:
std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());
v
wird als Funktionsdeklaration mit 2 Parametern interpretiert.
Die Problemumgehung besteht darin, ein weiteres Paar Klammern hinzuzufügen:
std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());
Oder, wenn Sie C++11 und Listeninitialisierung (auch bekannt als einheitliche Initialisierung) zur Verfügung haben:
std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};
Damit kann es auf keinen Fall als Funktionsdeklaration interpretiert werden.

1800 INFORMATIONEN
Weil es als Deklaration für eine Funktion behandelt wird:
int MyFunction(); // clearly a function
MyObject object(); // also a function declaration
Die gleiche Syntax wird für die Funktionsdeklaration verwendet – zB die Funktion object
nimmt keine Parameter und kehrt zurück MyObject
Weil der Compiler denkt, dass es sich um eine Deklaration einer Funktion handelt, die keine Argumente akzeptiert und eine MyObject-Instanz zurückgibt.
Sie können auch die ausführlichere Konstruktionsweise verwenden:
MyObject object1 = MyObject();
MyObject object2 = MyObject(object1);
In C++0x ermöglicht dies auch auto
:
auto object1 = MyObject();
auto object2 = MyObject(object1);

Schwarz
Ich denke, der Compiler würde es nicht wissen, wenn diese Aussage:
MyObject-Objekt();
ist ein Konstruktoraufruf oder ein Funktionsprototyp, der eine benannte Funktion deklariert Objekt mit Rückgabetyp MeinObjekt und keine Parameter.

Michael Burr
Wie schon oft erwähnt, ist es eine Erklärung. Es ist so für die Abwärtskompatibilität. Einer der vielen Bereiche von C++, die aufgrund ihres Erbes doof/inkonsistent/schmerzhaft/gefälscht sind.
10033400cookie-checkStandardkonstruktor mit leeren Klammernyes
Jemand sollte sich einen besseren Titel dafür einfallen lassen, aber ich kann mir nicht vorstellen, was das wäre. Buchstabieren Sie zumindest “Konstruktor”, um die Suchmaschine(n) zu unterstützen.
– Adam Mitz
8. Oktober 2008 um 5:18 Uhr
Und dies ist nur ein weiteres gutes Beispiel dafür, dass C++ kontextsensitiv ist. Der Beispielcode in der Frage würde auch fehlschlagen, wenn
blah
wäre eine Klasse.– Albert
27. August 2010 um 21:03 Uhr
Eine Sache, die mir aufgefallen ist, ist, dass der Compiler keinen Fehler ausgibt, wenn ich nur den Standardkonstruktor habe, wenn ich ihn verwende
()
z.BMyObject object
funktioniert wie gewohnt &MyObject object()
gibt keinen Fehler! Könnte bitte jemand erklären warum? Ich meine, ich habe die Funktion in meinem nicht definiertmain
… also sollte es einen Fehler geben, oder? Vielen Dank im Voraus!– Mailand
12. November 2020 um 0:04 Uhr