Liste des règles de résolution de noms (et de surcharge) C ++

Où puis-je trouver une liste des règles qu’un compilateur compatible C ++ doit appliquer pour effectuer la résolution des noms (y compris la surcharge)?

Je voudrais quelque chose comme un algorithme en langage naturel ou un organigramme.

Le standard C ++ a bien sûr cet ensemble de règles, mais il est construit au fur et à mesure que de nouvelles instructions de langage sont introduites et que le résultat est difficile à mémoriser.

Pour faire une histoire courte, j’aimerais connaître la réponse complète et détaillée à la question ” Quel compilateur fait quand il voit le nom” A “ ?”

Je sais que C ++ est tout ” Nous faisons ceci quand X mais pas Y si Z tient ” donc, je demande s’il est possible de le rendre plus linéaire.

EDIT : Je travaille sur un brouillon de ce sujet, quelque chose qui pourrait être amélioré collectivement une fois posté. Cependant, je suis très occupé ces jours-ci et cela peut prendre du temps pour avoir quelque chose de publiable. Si quelqu’un est intéressé, je ferai mieux de promouvoir la “note personnelle sur un fichier txt brut” et la publierai.

Eh bien, dans les grandes lignes:

  • Si le nom est précédé de :: , comme dans ::A ou X::A , utilisez une recherche de nom qualifié . Recherchez d’abord X , s’il existe (sinon utilisez l’espace de noms global), puis recherchez A Si X est une classe et que A n’est pas un membre direct, examinez toutes les bases directes de X Si A se trouve dans plus d’une base, échouer.

  • Sinon, si le nom est utilisé comme un appel de fonction tel que A( X ) , utilisez une recherche dépendante des arguments . C’est la partie difficile. Recherchez A dans l’espace de nommage dans lequel le type de X été déclaré, dans les amis de X , et si X est une instanciation de modèle, de même pour tous les arguments impliqués. Les étendues associées uniquement à typedef ne s’appliquent pas. Faites ceci en plus de la recherche non qualifiée.

  • Commencez par une recherche non qualifiée si la recherche dépendante des arguments ne s’applique pas. C’est la manière habituelle de trouver les variables. Commencez à la scope actuelle et travaillez jusqu’à ce que le nom soit trouvé. Notez que ceci respecte using namespace directives d’ using namespace , ce qui n’est pas le cas des deux autres cas.

Le simple fait de jeter un coup d’œil à la norme révélera de nombreuses exceptions et pièges. Par exemple, la recherche non qualifiée est utilisée pour déterminer si le nom est utilisé comme appel de fonction, par opposition à une expression de dissortingbution, avant que ADL ne soit utilisé pour générer une liste de surcharges potentielles. La recherche non qualifiée ne recherche pas d’objects dans des étendues de classes nestedes, car ces objects peuvent ne pas exister au moment de la référence.

Faites preuve de bon sens et posez des questions plus spécifiques lorsque (comme souvent) l’intuition échoue.