ADL-Fehler beim Finden von Funktionsvorlagen
In C ermöglicht die argumentabhängige Suche (ADL) die Suche nach Deklarationen von Funktionsnamen innerhalb der Namespaces, die den Argumenten in einem Funktionsaufruf zugeordnet sind. Allerdings gibt es in der C-Spezifikation eine Einschränkung, wenn es um Funktionsvorlagen und ADL geht.
Die Einschränkung
Laut C-Standard 14.8.1.6 gilt dies für ADL nicht gelten für Funktionsvorlagen, es sei denn, es gibt zum Zeitpunkt des Aufrufs eine sichtbare Funktionsvorlage mit demselben Namen. Das bedeutet, dass bei Funktionsvorlagen mit expliziten Vorlagenargumenten der Aufruf die richtige syntaktische Form mit einer sichtbaren Funktionsvorlage haben muss.
Beispiel
Betrachten Sie das folgende Beispiel:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }
In diesem Beispiel findet und löst ADL „non_template“ beim ersten Aufruf auf, da „non_template“ eine gewöhnliche Funktion ist. Für den zweiten Aufruf ist frob jedoch eine Funktionsvorlage. Da zum Zeitpunkt des Aufrufs keine sichtbare Frob-Funktionsvorlage vorhanden ist, schlägt ADL fehl und der Aufruf ist syntaktisch nicht wohlgeformt.
Behebung der Einschränkung
An Um diese Einschränkung zu umgehen, stellen Sie sicher, dass die Funktionsvorlage im Bereich des Aufrufs sichtbar ist. Dies kann erreicht werden, indem die Funktionsvorlage im aktuellen Namensraum deklariert wird oder indem der Aufruf mit dem Namensraum qualifiziert wird, der die Funktionsvorlage enthält.
Das obige ist der detaillierte Inhalt vonWarum schlägt die argumentabhängige Suche (ADL) für C-Funktionsvorlagen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!