ADL und Funktionsvorlagen
Argument-Dependent Lookup (ADL) spielt in C eine wichtige Rolle, indem es die automatische Suche von Funktionen und Objekten erleichtert in zugehörigen Namespaces basierend auf den verwendeten Argumenttypen. Allerdings weist dieser Mechanismus Einschränkungen auf, wenn es um Funktionsvorlagen geht.
Einschränkung bei der Suche nach Funktionsvorlagen mit ADL
Der letzte Aufruf im bereitgestellten Codeausschnitt konnte aufgrund eines Fehlers nicht kompiliert werden auf eine Einschränkung in der C-Spezifikation zurückzuführen. Gemäß Abschnitt 14.8.1.6 des C-Standards 03:
„Aber wenn eine Funktionsvorlage mit expliziten Vorlagenargumenten verwendet wird, hat der Aufruf nicht die richtige syntaktische Form, es sei denn, es ist eine Funktionsvorlage mit diesem Namen sichtbar.“ zum Zeitpunkt des Aufrufs.“
Das bedeutet, dass ADL nur Funktionsvorlagen finden kann, die im Rahmen des Aufrufs sichtbar sind. Im gegebenen Beispiel ist frob<0> ist ein Aufruf einer Funktionsvorlage mit expliziten Vorlagenargumenten. Allerdings gibt es zum Zeitpunkt des Aufrufs in main keine sichtbare Deklaration der Frob-Vorlage.
Unterscheidung zu einfachen Funktionsnamen
Die Einschränkung gilt nicht für einfache Funktionsnamen. Für solche Namen wird ADL auch dann verwendet, wenn die Funktion im Rahmen des Aufrufs nicht sichtbar ist. Dies liegt daran, dass der Aufruf weiterhin die syntaktische Form eines Funktionsaufrufs beibehält.
Beispiel
Das folgende Beispiel veranschaulicht das Verhalten weiter:
namespace A { struct B { }; template<int X> void f(B); } namespace C { template<class T> void f(T t); } void g(A::B b) { f<3>(b); //ill-formed: not a function call A::f<3>(b); //well-formed C::f<3>(b); //ill-formed; argument dependent lookup // applies only to unqualified names using C::f; f<3>(b); //well-formed because C::f is visible; then // A::f is found by argument dependent lookup }
In diesem Beispiel ist der Aufruf von f<3>(b) falsch formatiert, da zu diesem Zeitpunkt keine sichtbare Funktionsvorlage mit dem Namen f vorhanden ist. Der Aufruf von A::f<3>(b) ist wohlgeformt, da die f-Vorlage im A-Namespace sichtbar ist. Der Aufruf von C::f<3>(b) ist falsch formatiert, da ADL nur für nicht qualifizierte Namen gilt. Durch die Verwendung der using-Direktive für den Alias C::f wird der Aufruf von f<3>(b) wohlgeformt, da der f-Name jetzt am Punkt des Aufrufs sichtbar ist.
Das obige ist der detaillierte Inhalt vonWarum findet die argumentabhängige Suche (ADL) keine Funktionsvorlagen mit expliziten Vorlagenargumenten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!