Warum Funktionsvorlagen der ADL-Erkennung widerstehen
In C ermöglicht die argumentabhängige Suche (ADL) Compilern das Auffinden von Funktionen ohne explizite Namespace-Qualifizierung. Wenn es um Funktionsvorlagen geht, stößt ADL jedoch auf eine Einschränkung.
Der Kern davon ist in 14.8.1.6 von C Standard 03 festgehalten:
"Aber wenn eine Funktionsvorlage mit expliziten Vorlagenargumenten vorliegt verwendet wird, hat der Aufruf nicht die korrekte syntaktische Form, es sei denn, an der Stelle ist eine Funktionsvorlage mit diesem Namen sichtbar call."
Lassen Sie es uns anhand eines Beispiels aufschlüsseln:
Im folgenden Snippet haben wir eine Funktionsvorlage frob und eine Nicht-Vorlagenfunktion non_template innerhalb des Namespace ns:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} }
Während der direkte Aufruf von non_template zulässig ist, ist der Versuch, frob<0> aufzurufen, zulässig. auf einem Objekt von foo schlägt die Kompilierung fehl.
Warum?
Weil der Aufruf frob<0>(f) ohne die Namespace-Qualifikation syntaktisch ungültig ist. Ohne einen expliziten Namespace kann der Compiler nicht wissen, welche Frob-Vorlage er während der ADL finden soll.
Um dies zu beheben, muss man den Aufruf von Frob explizit qualifizieren oder den Namespace mithilfe von using in den Gültigkeitsbereich bringen. Auf diese Weise kann der Compiler dann ADL verwenden, um die richtige Vorlagendefinition zu finden.
Das obige ist der detaillierte Inhalt vonWarum findet die argumentabhängige Suche (ADL) keine Funktionsvorlagen ohne explizite Namespace-Qualifizierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!