Ricerca di nomi in due fasi per i modelli C++: perché?




templates name-lookup (2)

Potevano. Questo è il modo in cui ha funzionato la maggior parte delle prime implementazioni di modelli, ed è ancora il modo in cui ha funzionato il compilatore Microsoft. Si è sentito (in commissione) che questo era troppo incline agli errori; rendeva troppo facile il dirottamento accidentale di un nome, con l'istanziazione in un'unità di traduzione che prendeva un nome locale, piuttosto che il simbolo globale desiderato. (Una tipica unità di traduzione consisterà in una sequenza di #include s, che dichiara i nomi che tutti dovrebbero vedere, seguito dal codice di implementazione. Nel punto di istanziazione, tutto ciò che precede il punto di istanza è visibile, incluso il codice di implementazione.)

La decisione finale era quella di classificare i simboli in un modello in due categorie: dipendenti e non dipendenti, e di insistere sul fatto che i simboli non dipendenti siano risolti nel punto di definizione del modello, per ridurre il rischio che vengano accidentalmente legati ad alcuni simboli di implementazione locali. Insieme all'obbligo di specificare typename e template quando appropriato per i simboli dipendenti, ciò consente anche l'analisi e qualche controllo degli errori nel punto di definizione del modello, piuttosto che solo quando il modello viene istanziato.

Perché lo standard C ++ definisce la ricerca a due fasi per i modelli? Non è possibile che le dichiarazioni non dipendenti e le definizioni delle definizioni vengano rimandate anche allo stadio di istanziazione?


Questo potrebbe essere visto come un'applicazione di separazione delle preoccupazioni .

Nella prima fase controlla solo la sintassi corretta e risolve i nomi non dipendenti, come spiegato here . Nella seconda fase fa qualcosa di più specifico del modello, verificando se le chiamate sono valide con i tipi specifici. Vedi questo [risposta] ( Ricerca in due fasi - spiegazione necessaria )

Inoltre, se fosse fatto in una sola fase, allora dovrebbe essere fatto ogni istanza. Questo modo è fatto solo una volta.

Se si farebbe solo sulla prima istanza, allora sarebbe la stessa cosa, solo meno strutturata.





name-lookup