Ich habe diesen Gotw gelesen und hier ist ein Codebeispiel von dort:
%Vor%Die Frage lautete: Wie viele Fehler sollte ein kompilierbarer Compiler geben:
Ich habe eine beantwortet, weil dieser Code äquivalent zu
ist %Vor%Und ich dachte, dass ein Semikolon nach einer statischen Funktionsdefinition ein Fehler wäre. Aber Herr Sutter sagt 0 und erklärt (abgesehen von den Dingen, die ich verstehe) das
Das "extra" Semikolon ist erlaubt bei das Ende einer Funktionsdeklaration.
Meine Frage ist:
Kann ein Semikolon zwischen zwei Elementen oder an einer anderen Stelle in einer Klassendefinition auftreten wie in
%Vor%Ja, nach einer Funktionsdefinition in einem Klassenspezifizierer ist ein Semikolon explizit erlaubt. Daher ist im C ++ 0x-Entwurf auch Folgendes gültig: Das erste Semikolon gehört zur Funktionsdefinition, das zweite zum Klassenbezeichner, der an das Funktionsdefinitions-Nicht-Terminal delegiert.
%Vor% Aber drei Semikolons wären illegal. Ebenso zwei Semikolons nach einer Funktionsdefinition mit einem Body. Der entsprechende Text in der Spezifikation ist die Grammatik bei 9.2[class.mem]
.
Semikolons nach Funktionsdefinitionen waren bereits in C ++ 03 erlaubt, aber nach Funktionsdefinitionen waren sie nicht im Namensraumbereich erlaubt. C ++ 0x behebt das durch Einführung von leeren Deklarationen. Aber diese erscheinen nur, wenn Sie nach Funktionsdefinitionen außerhalb von Klassenkörpern ein Semikolon haben.
Sutter spricht über "extra" Semikolons am Ende der Funktion Deklarationen obwohl das nicht ganz korrekt ist. Weil die folgende Syntax ungültig ist
%Vor% Ein zusätzliches Semikolon in einem Klassenspezifizierer ist nur nach einer Funktionsdefinition gültig. Außerdem ist eine Überprüfung bei 9.2
nicht möglich, wenn die Funktionsdefinition eine Vorlage ist
Dies liegt daran, dass es von einer Template-Deklaration analysiert wird (die den verbleibenden Text selbst zu Funktionsdefinition parsen wird), für die der Klassenspezifizierer nicht verfügt ein zusätzliches ;
danach.
;
ist eine leere Anweisung. Sie können so viele leere Anweisungen haben, wie Sie möchten. Es ist absolut richtig.
ist dasselbe wie
%Vor%Ähnliche Frage: Warum sind leere Ausdrücke in C / C ++ erlaubt?
Bearbeiten:
Eine Erklärung eines Mitgliedes ist auch eine Aussage. Eine leere Anweisung in der Klasse ist also etwas wie ein & lt; & lt; leer & gt; & gt; Deklarationsanweisung innerhalb der Klasse:)