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:
Die Spiegelung muss von einem Klassenmitglied durchgeführt werden (kein Problem, wenn es sich um den lokalen Bereich einer Funktion handelt).
declltype ([Shadowed Name]) muss im Shadowing-Bereich vor der Deklaration von [shadowing name] verwendet werden.
Meine Frage ist zweifach:
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:
Tags und Links c++ gcc scope language-lawyer decltype