declaración de problemas:
usuarios comúnmente expresa preocupaciones que Microsoft Visual C (MSVC) luchan con la implementación correctamente de dos plantillas. ¿Qué aspectos específicos del mecanismo no funcionan como se esperan?
en segundo plano:
La instancia de la plantilla de dos fases implica una verificación de sintaxis inicial que MSVC supuestamente realiza. Sin embargo, surgen dudas sobre si esta verificación verifica si los nombres utilizados dentro de las plantillas se declaran adecuadamente.
explicación:
de hecho, la verificación de sintaxis inicial de MSVC está limitada en el alcance. No verifica la presencia de nombres declarados, lo que lleva a problemas de compilación cuando los nombres carecen de declaraciones adecuadas.
para ilustrar esto, considere el siguiente ejemplo:
int foo(void*); templatestruct S { S() { int i = foo(0); } }; void foo(int); int main() { S s; }
Un compilador que cumple con el estándar resolvería la llamada foo (0) durante la primera fase y la ataría a foo (void*). Sin embargo, MSVC pospone este proceso a la segunda fase, que es incorrectamente vinculante foo (0) a foo (int) y resulta en un error.
Además, la implementación de MSVC de la segunda fase se desvía de la especificación del lenguaje de dos maneras:
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {} int main() { N::S s; foo(&s); }
En ambos casos, el comportamiento de MSVC contraviene la separación especificada entre la primera y segunda fases de la instancia de la plantilla. Esta implementación incorrecta persiste en Visual Studio 2015.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3