Interaktion zwischen decltype und Klassenmitgliedsnamen, die einen externen Namen spiegeln

Lesezeit: 2 Minuten

Interaktion zwischen decltype und Klassenmitgliedsnamen die einen externen Namen spiegeln
jacg

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:

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

  2. decltype([shadowed name]) muss im Shadowing-Scope vor der Deklaration von verwendet werden [shadowing name].

Meine Frage ist zweigeteilt:

  1. Ist gcc berechtigt, diesen Kodex abzulehnen?
  2. Wo steht das in der Norm?

  • 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


Interaktion zwischen decltype und Klassenmitgliedsnamen die einen externen Namen spiegeln
Shafik Yaghmur

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 };

  • Sie zitierten a Entwurf, was wenig bedeutet. Ich zeige Ihnen, wie Sie den tatsächlichen Standard zitieren, der maßgeblich ist.

    – Leichtigkeitsrennen im Orbit

    1. November 14 um 5:17 Uhr

  • Die Entwürfe “bedeuten wenig” sind nicht .. ganz wahr. Ihre vollständige Bezeichnung lautet „Standard Arbeiten Entwurf“, und als solche sind sie um einiges mehr als „nur ein Entwurf“. Betrachtet man diese Frage, wird deutlich, dass sie nach und nach verfeinert werden.

    – Jongware

    2. November 14 um 13:49 Uhr


.

619740cookie-checkInteraktion zwischen decltype und Klassenmitgliedsnamen, die einen externen Namen spiegeln

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy