Introduction
Microsoft Visual C (MSVC ) a souvent été critiqué pour sa prétendue mise en œuvre défectueuse de l'instanciation de modèle en deux phases. Cet article approfondit les détails de cette critique, examine le problème sous-jacent et fournit une explication détaillée.
La controverse sur l'instanciation de modèle en deux phases
L'instanciation de modèle en deux phases est un processus en C dans lequel les classes et les fonctions de modèles sont d'abord vérifiées syntaxiquement pour vérifier leur exactitude, puis une instanciation complète se produit sur les sites d'utilisation ultérieurs. Cependant, des allégations ont été faites selon lesquelles MSVC n'implémente pas correctement ce mécanisme.
Première compréhension du problème
Au départ, on pensait que MSVC effectuait uniquement des vérifications de syntaxe de base sur les définitions de modèle, en ignorant si les noms utilisés dans le modèle ont été déclarés. Cependant, cette compréhension est incomplète.
La véritable nature du problème
Le problème réel avec l'instanciation de modèle en deux phases de MSVC comprend deux couches interconnectées :
Couche 1 : recherche incorrecte de première phase
MSVC ne parvient pas à s'exécuter recherche précoce (première phase) d'expressions non dépendantes, comme dans l'exemple :
int foo(void*); template<typename T> struct S { S() { int i = foo(0); } }; void foo(int);
MSVC reporte cette recherche à la deuxième phase, où il lie par erreur l'expression à 'foo(int)', entraînant une erreur.
Couche 2 : Recherche incorrecte de la deuxième phase
La deuxième phase de la recherche de modèles dans MSVC est également erronée. Alors que la norme C spécifie que les espaces de noms nommés par ADL sont étendus dans la deuxième phase, MSVC étend également par erreur la recherche non-ADL.
Cela peut être illustré par l'exemple suivant :
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {}
Bien qu'il soit dépendant, l'appel à bar(t) est incorrectement résolu en void bar(N::S *s), démontrant le comportement inapproprié de la deuxième phase de MSVC. lookup.
Conclusion
L'implémentation par Microsoft Visual C de l'instanciation de modèle en deux phases est en effet imparfaite, mais pas de la manière simpliste initialement comprise. Le problème est une interaction complexe entre des recherches incorrectes de première et de deuxième phases qui peuvent entraîner des erreurs ou un comportement incorrect pour certaines constructions de code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!