c++ - microsoft - visual studio installer
Búsqueda de nombres de dos fases para plantillas C++-¿Por qué? (2)
¿Por qué el estándar de C ++ define la búsqueda de dos fases para las plantillas? ¿No podrían las declaraciones no dependientes y las búsquedas de definiciones diferirse también a la etapa de creación de instancias?
Ellos podrian. Esta es la forma en que funcionó la mayoría de las implementaciones iniciales de plantillas, y sigue siendo la forma en que funcionó el compilador de Microsoft. Se sintió (en el comité) que esto era demasiado propenso a errores; hizo que fuera demasiado fácil secuestrar accidentalmente un nombre, con la instanciación en una unidad de traducción que recogía un nombre local, en lugar del símbolo global deseado. (Una unidad de traducción típica consistirá en una secuencia de #include
, que declarará los nombres que todos deberían ver, seguidos del código de implementación. En el momento de la creación de instancias, todo lo que precede al punto de instalación es visible, incluido el código de implementación).
La decisión final fue clasificar los símbolos en una plantilla en dos categorías: dependiente y no dependiente, e insistir en que los símbolos no dependientes se resuelvan en el punto de definición de la plantilla, para reducir el riesgo de que se los vincule accidentalmente. a algunos símbolos de implementación local. Junto con el requisito de especificar el typename
y la template
cuando es apropiado para los símbolos dependientes, esto también permite el análisis y la comprobación de errores en el punto de definición de la plantilla, en lugar de solo cuando se crea una instancia de la plantilla.
Esto podría verse como una aplicación de separación de preocupaciones .
En la primera fase, solo verifica la sintaxis correcta y resuelve los nombres no dependientes, como se explica here . En la segunda fase, hace algo más específico de la plantilla, verificando si las llamadas son válidas con los tipos específicos. Ver esto [respuesta] ( Búsqueda de dos fases - explicación necesaria )
Además, si se hiciera en una sola fase, debería hacerse cada instanciación. De esta manera se hace solo una vez.
Si se hiciera solo en la primera instanciación, sería lo mismo, solo que menos estructurado.