c++ - index - php openclassroom



Recherche de nom en deux phases pour les modèles C++-Pourquoi? (2)

Cela pourrait être considéré comme une application de la séparation des préoccupations .

Lors de la première phase, il vérifie simplement la syntaxe correcte et résout les noms non dépendants, comme expliqué here . Au cours de la deuxième phase, il fait quelque chose de plus spécifique au modèle, en vérifiant si les appels sont valides avec les types spécifiques. Voir ceci [réponse] ( recherche en deux phases - explication nécessaire )

De plus, si cela se faisait en une seule phase, alors il faudrait le faire à chaque instanciation. Cette façon de faire ne se fait qu'une fois.

Si se ferait seulement à la première instanciation, alors ce serait la même chose, seulement moins structurée.

Pourquoi la norme C ++ définit-elle la recherche en deux phases pour les modèles? Les déclarations et définitions de définitions non dépendantes ne pourraient-elles pas également être reportées à l’étape d’instanciation?


Answer #1

Ils pourraient. C’est la façon dont les premières implémentations de modèles ont fonctionné, et c’est toujours la manière dont fonctionnait le compilateur Microsoft. On a senti (en comité) que c'était trop sujet aux erreurs; il était trop facile de détourner accidentellement un nom, l'instanciation dans une unité de traduction reprenant un nom local plutôt que le symbole global souhaité. (Une unité de traduction typique consistera en une séquence de #include s, déclarant les noms que tout le monde devrait voir, suivi du code d'implémentation. Au moment de l'instanciation, tout ce qui précède le point d'instation est visible, y compris le code d'implémentation.)

La décision finale était de classer les symboles dans un modèle en deux catégories: dépendants et non dépendants, et d’insister pour que les symboles non dépendants soient résolus au point de définition du modèle, afin de réduire le risque qu’ils soient liés accidentellement. à certains symboles d'implémentation locaux. Associé à la nécessité de spécifier typename et template lorsque cela est approprié pour les symboles dépendants, cela permet également d'analyser et de vérifier les erreurs au point de définition du modèle, plutôt que seulement lorsque le modèle est instancié.





name-lookup