Heim > Backend-Entwicklung > C++ > Warum findet die argumentabhängige Suche (ADL) keine Funktionsvorlagen mit expliziten Vorlagenargumenten?

Warum findet die argumentabhängige Suche (ADL) keine Funktionsvorlagen mit expliziten Vorlagenargumenten?

Susan Sarandon
Freigeben: 2024-12-11 12:42:12
Original
414 Leute haben es durchsucht

Why Does Argument-Dependent Lookup (ADL) Fail to Find Function Templates with Explicit Template Arguments?

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage