Argument-dependent-Namen-Suche

In der Programmiersprache C ++, Argument-abhängige Lookup oder Argument abhängigen Namen-Suche, gilt für die Abfrage von einem uneingeschränkten Funktionsnamen abhängig von den Typen der Argumente im Funktionsaufruf angegeben. Dieses Verhalten wird auch als Koenig Lookup bekannt, wie es oft Andrew Koenig zugeschrieben wird, obwohl er nicht Erfinders.

ADL tritt nur auf, wenn die normale Nachschlag eines unqualifizierten Namen fehlschlägt, einen passenden Elementfunktion zu finden. In diesem Fall können andere Namensräume im normalen Nachschlag nicht als durchsucht werden, wo der Satz von Namensräumen durchsucht werden soll, hängt von den Typen der Funktionsargumente. Insbesondere wird die Menge von Deklarationen während der ADL-Lookup-Prozess entdeckt und für die Auflösung des Funktionsnamens betrachtet, ist die Vereinigung von den Erklärungen normalen Lookup mit den Erklärungen suchen in der Gruppe von Namespaces mit der Art der Funktion assoziiert gefunden Argumente.

Typ-assoziierten Namespaces

Der Satz von zugehörigen Namensräume für jeden Typ T ist die strukturelle Bedeutung der T und dem Namensraum, wobei T definiert ist, wenn T eine Struktur-Typ, zusammen mit den Namensraum mit der Struktur zum Definieren des Typs T erforderlichen Typen zugeordnet, mit Ausnahme der Typen erforderlichen nur für die Definition Mitglieder. Dieser Satz von zugeordneten Namensräumen ist für die Lösung einen Funktionsaufruf Lookup mit einem Argument vom Typ T inklusive

Beispiel

Ein Beispiel ADL sieht so aus:

Ein gemeinsames Muster in der C ++ Standard Library ist es, überladene Operatoren, die auf diese Weise gefunden werden erklären. Zum Beispiel würde diese einfache Hallo Welt Programm das erwartete Ergebnis nicht gedruckt, wenn es nicht für ADL:

Verwendung entspricht dem Aufruf, die jedoch nicht über die Qualifier. In diesem Fall wird durch die Funktion ADL gefunden.

Man beachte, daß eine Funktion, aber es braucht vollständige Qualifikation, da es als Argument verwendet wird.

Schnittstellen

Funktionen, die von ADL gefunden werden als Teil der Schnittstelle einer Klasse. In der Standard Template Library, verschiedene Algorithmen verwenden unqualifizierte Anrufe von innerhalb des Namespace. Als Ergebnis wird die generische Funktion verwendet, wenn nichts anderes festgestellt wird, aber wenn diese Algorithmen sind mit einer Drittanbieter-Klasse ,, in einem anderen Namespace, das auch gefunden, verwendet wird, dass Überlast verwendet werden.

Kritik

Während ADL macht es praktisch für Funktionen außerhalb einer Klasse zu verhalten, als ob sie Teil der Schnittstelle der Klasse definiert wurden, macht es Namespaces weniger streng und kann so die Verwendung von vollständig qualifizierten Namen benötigen, wenn sie sonst nicht benötigt würde. Zum Beispiel kann die C ++ Standardbibliothek macht ausgiebig Gebrauch von uneingeschränkten Anrufe an std :: Swap, zwei Werte zu tauschen. Die Idee ist, dann kann man eine eigene Version von std :: Swap im eigenen Namensraum zu definieren, und es wird innerhalb der Standardbibliothek-Algorithmen verwendet werden. Mit anderen Worten wird das Verhalten des

kann oder kann nicht das gleiche wie das Verhalten sein

 denn wenn vorhanden ist, wird die zweite der obigen Beispiele ist es, während der erste wird nicht nennen. Außerdem, wenn aus irgendeinem Grund beide und definiert sind, dann ist das erste Beispiel nennen, aber die zweite wird nicht kompiliert, da wäre zweideutig.

Im Allgemeinen kann eine übermäßige Abhängigkeit von ADL nach semantischen Problemen führen. Wenn einer Bibliothek ,, erwartet unqualifizierte Anrufe auf eine Bedeutung und eine andere Bibliothek zu haben, erwartet, dass sie eine andere, dann Namespaces verlieren ihre Nützlichkeit. Wenn jedoch erwartet, dass eine Bedeutung haben und tut ebenso, dann gibt es keinen Konflikt, sondern ruft sein müsste vollständig qualifizierten damit ADL in die Quere kommen.

(0)
(0)
Kommentare - 0
Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha