Dieser Code
int clash;
struct Foo {
decltype(clash) clash;
};
kompiliert still auf Clang, kann aber auf gcc nicht kompiliert werden und gibt die Fehler aus
Fehler: Deklaration von ‘int Foo::clash’ [-fpermissive]
Fehler: Ändert die Bedeutung von „clash“ von „int clash“ [-fpermissive]
Es scheint, dass 2 Zutaten erforderlich sind, damit der Fehler auftritt:
-
Das Shadowing muss von einem Klassenmitglied durchgeführt werden (kein Problem, wenn es sich um den lokalen Geltungsbereich einer Funktion handelt).
-
decltype([shadowed name]) muss im Shadowing-Scope vor der Deklaration von verwendet werden [shadowing name].
Meine Frage ist zweigeteilt:
- Ist gcc berechtigt, diesen Kodex abzulehnen?
- Wo steht das in der Norm?
gcc
korrekt ist, ist das Programm falsch formuliert, obwohl dieser spezielle Verstoß keine Diagnose erfordert clang
muss keine bereitstellen.
Wenn wir uns den C++11-Standard ansehen (Der nächste Entwurf wäre N3337) Sektion 3.3.7
Klassenbereich es sagt:
Ein Name N, der in einer Klasse S verwendet wird, muss sich auf dieselbe Deklaration in seinem Kontext und bei Neubewertung im vollständigen Geltungsbereich von S beziehen. Für einen Verstoß gegen diese Regel ist keine Diagnose erforderlich.
und die nächste Regel sagt:
Wenn das Neuordnen von Mitgliedsdeklarationen in einer Klasse ein alternatives gültiges Programm unter (1) und (2) ergibt, ist das Programm falsch formatiert, es ist keine Diagnose erforderlich.
Es ist sinnvoll, Situationen zu vermeiden, in denen die Neuordnung der Deklarationen in einer Klasse ein anderes Programm ergibt. Es ist fraglich, ob diese beiden Regeln redundant sind oder nicht.
Der Abschnitt enthält auch das folgende Beispiel:
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK: X::c
char c;
enum { i = 2 };
};
und wenn wir dieses Beispiel mit versuchen gcc
(live sehen), erhalten wir einen fast identischen Fehler wie einen, den Ihr Code erzeugt:
error: declaration of 'i' [-fpermissive]
enum { i = 2 };
^
error: changes meaning of 'i' from '<anonymous enum> i' [-fpermissive]
enum { i = 1 };
.
Wie wäre es mit:
int chash[sizeof(clash)];
? Was sagt ein anderer Compiler? Ich denke, es hat nichts mit C++ 11-Beschwerde-Compilern zu tun, sondern wie sie sich in solchen Fällen verhalten.– Ajay
31. Oktober 14 um 19:30 Uhr