Semikolons in einer Klassendefinition

8

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:

  • Welcher Text im Standard erlaubt dies?
  • Bezieht sich dies nur auf Mitgliedsfunktionen?
  • Kann ein Semikolon zwischen zwei Elementen oder an einer anderen Stelle in einer Klassendefinition auftreten wie in

    %Vor%
Armen Tsirunyan 19.03.2011, 23:20
quelle

2 Antworten

14

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

%Vor%

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.

    
Johannes Schaub - litb 19.03.2011, 23:30
quelle
1

; ist eine leere Anweisung. Sie können so viele leere Anweisungen haben, wie Sie möchten. Es ist absolut richtig.

%Vor%

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:)

    
Maciej Ziarko 19.03.2011 23:23
quelle

Tags und Links