Maison >développement back-end >C++ >En quoi la recherche de modèle en deux phases de Microsoft Visual C diffère-t-elle de la norme et quelles en sont les conséquences ?

En quoi la recherche de modèle en deux phases de Microsoft Visual C diffère-t-elle de la norme et quelles en sont les conséquences ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-07 15:52:13522parcourir

How Does Microsoft Visual C  's Two-Phase Template Lookup Differ from the Standard, and What are the Consequences?

La recherche de modèle en deux phases mal comprise dans Microsoft Visual C

Introduction

Instanciation de modèle en deux phases, également connue en tant que recherche précoce et tardive, est un aspect crucial de la programmation de modèles C. Cependant, l'implémentation Visual C (MSVC) de cette fonctionnalité par Microsoft a fait l'objet d'un examen minutieux car elle serait apparemment inadéquate.

Recherche en deux phases en théorie

Dans un compilateur C standard, la recherche en deux phases s'applique aux fonctions et classes de modèle. Dans la première phase, le compilateur effectue une vérification syntaxique, identifiant les déclarations avec le nom approprié. La recherche et la liaison réelles des noms sont différées jusqu'à la deuxième phase, qui se produit lors de l'instanciation du modèle.

Mise en œuvre limitée de MSVC

Contrairement aux attentes, la recherche de modèle de MSVC est limitée . Dans la première phase, il effectue uniquement une vérification syntaxique de base. Le problème survient dans la deuxième phase, où il ne parvient pas à :

  • Effectuer une recherche anticipée : MSVC n'adhère pas pleinement à la recherche anticipée, car il retarde la vérification des noms non dépendants. jusqu'à l'instanciation du modèle.
  • Extendre la recherche non-ADL : Au cours de la deuxième phase, MSVC étend de manière incorrecte recherche non-ADL pour inclure les déclarations ajoutées après la définition du modèle. Ce comportement s'écarte de la norme, qui permet uniquement d'étendre les espaces de noms nommés par l'ADL.

Conséquences d'une recherche interrompue

La mise en œuvre défectueuse de la recherche en deux phases la recherche dans MSVC peut entraîner des erreurs lors de l'instanciation du modèle. Par exemple, considérons le code suivant :

int foo(void*);

template<typename T> struct S {
  S() { int i = foo(0); }
};

void foo(int);

int main() {
  S<int> s;
}

Dans cet exemple, un compilateur conforme aux normes effectuerait une recherche anticipée et lierait « foo(0) » à « foo(void*) » dans le constructeur. Cependant, MSVC différait la recherche jusqu'à l'instanciation, provoquant une erreur de compilation en raison de la surcharge ambiguë de 'foo'.

Conclusion

Bien que MSVC propose une implémentation de base de deux -phase de recherche de modèle, elle ne répond pas aux attentes de la norme. La recherche précoce incomplète et l'extension incorrecte de la recherche non ADL peuvent introduire des erreurs et limiter la convivialité des modèles dans les projets basés sur MSVC. Comprendre ces limitations est crucial pour gérer efficacement le code basé sur des modèles dans cet environnement.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn