2013-07-15 11 views
9

Während ich nach Hinweisen auf ein Kompilierungsproblem suchte, das ich in meiner Quelle hatte, bin ich auf bug report (against Mozilla's JavaScript engine source) im Zusammenhang mit Funktionen nachschlagen gekommen. Zitiert aus dem Bug-Report:static function lookup von einem Template-Funktionsproblem mit xlC

TypedArrayTemplate ist (natürlich) eine Vorlage, und es verweist INT_TO_JSVAL, eine statische Inline-Funktion, ohne sie mit prefixing "::". Dies unterbricht xlC, weil es INT_TO_JSVAL nicht auflösen kann. Der Standard fordert nicht, dass Statiken berücksichtigt werden, wenn der nicht qualifizierte Name nicht im Kontext der Vorlagenargumente gefunden wird. g ++ tut dies Fallback, xlC nicht.

Informative Nachricht vom Compiler:

(I) Static declarations are not considered for a function call if the function is not qualified. 

In meinem Fall der Code, der dazu war ähnlich versagte:

namespace N 
{ 

static bool foo (std::string const &); 

template <typename T> 
void bar (T const &, std::string const & s) 
{ 
    // expected unqualified call to N::foo() 
    foo (s); 
} 

void baz (std::string const & s) 
{ 
    bar (s); 
} 

} // namespace N 

Ist das Verhalten, das xlC wirklich korrekt implementiert? Wo spricht der Standard 2003 oder 2011 darüber?

Antwort

9

Vor C++ 11 war das das richtige Verhalten: unqualifizierte Namensauflösung der in Vorlagen verwendeten Namen wurde definiert, um nur Funktionen mit externer Verknüpfung zu finden.

C++ 03 Abschnitt 14.6.4.2 Candidate Funktionen [temp.dep.candidate] Absatz 1:

Für einen Funktionsaufruf, der auf einem Template-Parametern abhängig ist, wenn der Name der Funktion ist ein unqualifizierter-id aber keine Template-id werden die Kandidaten Funktionen gefunden die üblichen Lookup Regeln (3.4.1, 3.4.2), außer dass:

  • Für den Teil der Lookup unqualifizierte Namen-Suche mit (3.4. 1), nur Funktionsdeklarationen mit externer Verknüpfung aus dem Templat Der Definitionskontext wird gefunden.

  • Für den Teil des Nachschlag zugehörige Namensräume (3.4.2) unter Verwendung von nur Funktionsdeklarationen mit externer Verknüpfung in Kontext entweder der Schablonendefinition gefunden oder die Vorlage Instanziierung Kontext gefunden.

die ++ 11 bis C ändert sich in:

Für einen Funktionsaufruf, der mit den üblichen Lookup-Regeln auf einem Template-Parameter abhängig ist, werden die Kandidatenfunktionen gefunden (3.4.1 , 3.4.2, 3.4.3), außer dass:

  • Für den Teil der Lookup unqualifizierte Namen-Suche (3.4.1) oder qualifizierte Namen-Suche (3.4.3) verwendet, nur Funktionsdeklarationen aus dem Vorlagen-Definitionskontext werden gefunden.

  • Für den Teil der Suche, der verknüpfte Namespaces verwendet (3.4.2), werden nur Funktionsdeklarationen gefunden, die in entweder im Vorlagen-Definitionskontext oder im Vorlagen-Instanziierungskontext gefunden werden.

+0

Muss ich Anforderung richtig, dass C++ 11 fällt die externe Verknüpfung lesen verwenden? – wilx

+0

Ja, das ist richtig. – Casey

+0

Diese Antwort könnte eine Zusammenfassung verwenden. –

4

V12.1 des Compilers hat das neue Verhalten standardmäßig.

Wenn Sie eine frühere Version des xlC Compiler verwenden Sie die Option -qdebug=KeepUnqualifiedStaticCandidate