Zwei-Phasen-Lookup – Erläuterung erforderlich

Lesezeit: 2 Minuten

Was bedeutet es, dass der Compiler eine Zwei-Phasen-Suche verwendet, um die Vorlagenklasse zu kompilieren?

  • @Nawaz Ich habe nur von der Zwei-Phasen-Suche gehört. Gibt es etwas, das ich vermisse?

    – kleinB

    14. Oktober 2011 um 12:37 Uhr

  • Einen kurzen und nützlichen Artikel zu diesem Thema finden Sie unter blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html

    – Nikola Smiljanić

    10. Februar 2014 um 23:40 Uhr

  • Siehe auch stackoverflow.com/a/10171507/76722 und stackoverflow.com/a/7241548/76722

    – Sebastian Mach

    5. August 2015 um 14:21 Uhr

Zwei Phasen Lookup Erlauterung erforderlich
Alok Speichern

Vorlagen werden (mindestens) zweimal kompiliert:

  1. Ohne Instanziierung wird der Vorlagencode selbst auf Syntax geprüft.
    ZB: Alle Syntaxfehler wie ; usw.

  2. Zum Zeitpunkt der Instanziierung (wenn der genaue Typ bekannt ist) wird der Vorlagencode erneut überprüft, um sicherzustellen, dass alle Aufrufe für diesen bestimmten Typ gültig sind.
    Beispiel: Die Vorlage kann wiederum Funktionen aufrufen, die für diesen bestimmten Typ möglicherweise nicht vorhanden sind.

Dies wird als bezeichnet Zwei-Phasen-Lookup.

  • Beachten Sie auch, dass die Suche nach nicht abhängigen Namen in der ersten Phase erfolgt, während die Suche nach Namen, die von einem Vorlagenparameter abhängen, in der zweiten Phase erfolgt. Die Bedeutung ist, dass, wenn Sie anrufen sqrt(1)dann sqrt muss deklariert werden, bevor die Vorlage definiert wird. Aber wenn du anrufst sqrt

    – Steve Jessop

    14. Oktober 2011 um 12:49 Uhr


  • Wie auch immer, deshalb heißt es zweiphasig Nachschlagen im Gegensatz zu nur zweiphasiger Kompilierung oder so. Die erste Phase soll mehr als nur die Syntax überprüfen, aber MS hatte einige Schwierigkeiten bei der Implementierung der ersten Lookup-Phase, also haben sie alles bei der Instanziierung erledigt: stackoverflow.com/questions/6273176/…

    – Steve Jessop

    14. Oktober 2011 um 12:56 Uhr


  • Historische Anmerkung: Ich habe einen Compiler verwendet, der eine Phase zum Zählen von geschweiften Klammern und eine Phase zum Kompilieren hatte, IOW gegeben template <class T> class C { put really anything here & ~ - (but nothing unbalanced and no 8-bit char outside string literal) } würde akzeptiert werden, iff C wurde nie instanziiert! Das war vor mehr als einem Jahrzehnt.

    – Neugieriger

    14. Oktober 2011 um 13:54 Uhr

  • Für Neugierige ist dies ein Auszug aus C++-Vorlagen: Das vollständige Handbuch.

    – legends2k

    20. August 2014 um 13:58 Uhr

  • Zusätzlich zu @SteveJessops Kommentar zu abhängigen Namen sollte auch darauf hingewiesen werden, dass es sich um eine "argumentabhängige Suche" handelt, die bei den abhängigen Namen stattfindet. Dies bedeutet, dass ::sqrt(::NS::A) nicht gefunden, da die zusätzliche Suche in stattfindet ::NS und nicht drin ::. Der letzte Punkt ist, dass der Geltungsbereich eines Alias, typedef oder using, nicht durchsucht wird, sondern nur der Geltungsbereich des Aliastyps selbst.

    – Richard Corden

    7. Mai 2015 um 18:23 Uhr

987550cookie-checkZwei-Phasen-Lookup – Erläuterung erforderlich

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy