Abhängige Namenssuche in Funktionsvorlage: clang rejects, gcc akzeptiert

8

Betrachten Sie das folgende Fragment:

%Vor%

clang lehnt diesen Code ab, gcc akzeptiert ihn. Ist das ein GCC Bug oder ist das ein Clang Bug?

    
Barry 05.03.2016, 19:37
quelle

2 Antworten

6

Ich glaube, das ist ein gcc-Fehler, der als 70099 eingereicht wurde. Von [temp.de.p.res]:

  

Beim Auflösen abhängiger Namen werden Namen aus den folgenden Quellen berücksichtigt:
  (1.1) - Deklarationen, die zum Zeitpunkt der Definition der Vorlage sichtbar sind.
  (1.2) - Deklarationen von Namespaces, die den Typen der Funktionsargumente sowohl aus dem Instanziierungskontext (14.6.4.1) als auch aus dem Definitionskontext zugeordnet sind.

foo::operator<() ist zum Zeitpunkt der Definition der Vorlage nicht sichtbar und befindet sich nicht in einem zugeordneten Namespace aus den Funktionsargumenten ( X 's assoziierter Namespace ist nur der globale Namespace :: ). Also ich denke, GCC ist falsch zu finden, foo::operator< und clang ist richtig, den Code abzulehnen.

    
Barry 05.03.2016 21:18
quelle
5

GCC ist falsch Clang ist korrekt. Die Tatsache, dass GCC ungültigen Code schluckt, wie der, den Sie gezeigt haben, wird auch auf der Kompatibilitätsseite von CLANG erwähnt.

Nicht qualifizierte Namen werden auf folgende Weise nachgeschlagen:

  1. Der Compiler führt eine unqualifizierte Suche in dem Bereich durch, in dem der Name geschrieben wurde. Für eine Vorlage bedeutet dies, dass die Suche an dem Punkt erfolgt, an dem die Vorlage definiert wurde, nicht an der Stelle, an der sie erstellt wurde. Da operator< zu diesem Zeitpunkt noch nicht deklariert wurde, wird dies nicht unterstützt finde es.
  2. Wenn der Name wie eine Funktion aufgerufen wird, führt der Compiler auch eine argumentabhängige Suche (ADL) durch. (Manchmal kann unqualifiziertes Nachschlagen ADL unterdrücken; für weitere Informationen siehe [basic.lookup.argdep], Absatz 3.) In ADL untersucht der Compiler die Typen aller Argumente für den Aufruf. Wenn ein Klassentyp gefunden wird, sucht er den Namen im Namespace dieser Klasse. Das Ergebnis sind alle Deklarationen, die in diesen Namespaces gefunden werden, sowie die Deklarationen aus der nicht qualifizierten Suche. Der Compiler führt jedoch erst ADL durch, wenn er alle Argumenttypen kennt.
101010 05.03.2016 19:56
quelle

Tags und Links