Heim >Backend-Entwicklung >C++ >Warum findet die argumentabhängige Suche (ADL) keine Funktionsvorlagen ohne explizite Namespace-Qualifizierung?

Warum findet die argumentabhängige Suche (ADL) keine Funktionsvorlagen ohne explizite Namespace-Qualifizierung?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-10 08:28:13847Durchsuche

Why Doesn't Argument-Dependent Lookup (ADL) Find Function Templates Without Explicit Namespace Qualification?

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&amp;) {}
    void non_template(foo const&amp;) {}
}

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!

Stellungnahme:
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