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.
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:
operator<
zu diesem Zeitpunkt noch nicht deklariert wurde, wird dies nicht unterstützt finde es. Tags und Links c++ templates language-lawyer