Ich habe ein kleines Programm mit so einfachem Code:
%Vor%Leider kompiliert es nicht. Ich habe versucht, es mit folgenden Teilen des Codes zu kompilieren:
%Vor%Und beide Varianten kompilieren gut. Ist es ein Fehler in meinem Compiler (clang 3.4)? Ich kann auch nicht verstehen, warum mein ursprünglicher Code nicht kompiliert.
Siehe Live-Beispiel .
Update: Es war ein Aprilscherz, natürlich. Danke an alle, die an der Diskussion teilgenommen haben. Ich danke auch @ecatmur für seine genaue, aber zu ernsthafte Antwort.
Ich wollte den Code bekommen, der seltsam aussah und gleichzeitig mit einem Compiler kompiliert hätte (weil es meiner Frage Respektabilität verschafft hätte). Mein Ziel war also nicht, einen standardkonformen Code zu erstellen. Aber als @Johannes Schaub - littb in Kommentaren notiert hat dieser Code zumindest ein Problem, das es schlecht formt. Die Zeile virtual override override;
ist eine Verletzung der folgenden Regel (siehe Absatz [basic.scope.class] 3.3.7 / 1 des Standards):
Ein Name
N
, der in einer KlasseS
verwendet wird, muss sich auf die gleiche Deklaration in seinem Kontext beziehen und wenn er im abgeschlossenen Bereich vonS
neu ausgewertet wird. Für einen Verstoß gegen diese Regel ist keine Diagnose erforderlich.
Wie ich sehen kann, kann es als virtual ::final::override override;
umgeschrieben werden, um standardkonform zu werden.
Warum sollten Sie erwarten, dass es kompiliert? final
ist endgültig, Sie können also nicht davon erben.
In Ihrem anderen Code:
%Vor%Dies definiert eine letzte Klasse ohne Basisklassen, also ist das in Ordnung.
%Vor% Dies deklariert eine Beschriftung override
und erzeugt bei dieser Beschriftung einen prvalue temporären Typ final
initialisiert mit dem Klammerinitialisierer {}
, der sofort zerstört wird:
Tags und Links c++ clang c++11 inheritance