Interaktion zwischen Dekltyp und Klassenmitgliedsnamen, der einen externen Namen schattiert

8

Dieser Code

%Vor%

kompiliert still beim clang, aber kompiliert nicht auf gcc mit den Fehlern

  

error: Deklaration von 'int Foo :: clash' [-fpermissiv]

     

error: ändert die Bedeutung von 'clash' von 'int clash' [-fpermissiv]

Es scheint, dass 2 Zutaten erforderlich sind, damit der Fehler auftritt:

  1. Die Spiegelung muss von einem Klassenmitglied durchgeführt werden (kein Problem, wenn es sich um den lokalen Bereich einer Funktion handelt).

  2. declltype ([Shadowed Name]) muss im Shadowing-Bereich vor der Deklaration von [shadowing name] verwendet werden.

Meine Frage ist zweifach:

  1. Ist gcc berechtigt, diesen Code abzulehnen?
  2. Wo steht das im Standard?
jacg 31.10.2014, 19:14
quelle

1 Antwort

9

gcc ist korrekt, das Programm ist schlecht formatiert, obwohl diese spezielle Verletzung keine Diagnose erfordert, also muss clang keine liefern.

Wenn wir uns den C ++ 11-Standard ansehen ( Der engste Entwurf wäre N3337 ) Abschnitt 3.3.7 Klassenbereich es heißt:

  

Ein Name N, der in einer Klasse S verwendet wird, muss sich auf dieselbe Deklaration beziehen   Kontext und wenn sie in dem abgeschlossenen Umfang von S. Nr   Für einen Verstoß gegen diese Regel ist eine Diagnose erforderlich.

und die nächste Regel sagt:

  

Wenn das Umordnen von Member-Deklarationen in einer Klasse eine alternative gültige ergibt   Programm unter (1) und (2), das Programm ist schlecht ausgebildet, keine Diagnose ist   erforderlich.

Es ist sinnvoll, Situationen zu vermeiden, in denen das Umordnen der Deklarationen in einer Klasse zu einem anderen Programm führt. Es ist seltsam, ob diese beiden Regeln redundant sind oder nicht .

Der Abschnitt enthält außerdem das folgende Beispiel:

%Vor%

und wenn wir dieses Beispiel mit gcc versuchen ( live sehen ) ), erhalten wir einen fast identischen Fehler zu einem, den Ihr Code erzeugt:

%Vor%     
Shafik Yaghmour 31.10.2014, 20:00
quelle