40 votes

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

Où puis-je trouver une liste des règles qu'un compilateur conforme à la norme C++ doit appliquer afin d'exécuter résolution des noms (y compris la surcharge) ?

J'aimerais quelque chose comme un algorithme ou un organigramme en langage naturel.

La norme C++ comporte bien sûr cet ensemble de règles, mais il est étoffé au fur et à mesure de l'introduction de nouvelles déclarations du langage, ce qui fait qu'il est assez difficile de s'en souvenir.

Pour faire court, j'aimerais connaître la réponse complète et détaillée à la question " Que fait le compilateur quand il voit le nom 'A' ? ?"

Je sais que le C++ est tout " Nous faisons cela lorsque X mais pas Y si Z est valable. "Je me demande donc s'il est possible de le rendre plus linéaire.

EDIT : Je travaille sur un brouillon de ce sujet, quelque chose qui peut ê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 vais promouvoir la "note personnelle sur un fichier txt brut" à quelque chose de mieux et le poster.

12voto

Potatoswatter Points 70305

Eh bien, dans les grandes lignes :

  • Si le nom est précédé de :: , comme dans ::A o X::A puis utiliser recherche de nom qualifié . Premier coup d'œil X s'il existe (sinon, utilisez l'espace de noms global), puis cherchez à l'intérieur de cet espace pour A . Si X est une classe, et A n'est pas un membre direct, alors regardez dans toutes les bases directes de X . Si A se trouve dans plus d'une base, échoue.

  • Sinon, si le nom est utilisé comme un appel de fonction tel que A( X ) utiliser recherche en fonction de l'argument . C'est la partie la plus difficile. Cherchez A dans l'espace de noms, le type de X a été déclaré dans, dans les amis de X et si X est une instanciation de modèle, de même pour tous les arguments impliqués. Les portées associées uniquement par typedef ne pas appliquer. Faites cela en plus de la recherche non qualifiée.

  • Commencez par recherche non qualifiée si la recherche dépendante de l'argument ne s'applique pas. C'est la façon habituelle de trouver des variables. Commencez par l'étendue actuelle et travaillez vers l'extérieur jusqu'à ce que le nom soit trouvé. Notez que cela respecte using namespace ce qui n'est pas le cas dans les deux autres cas.

Il suffit de jeter un coup d'œil à la norme pour découvrir de nombreuses exceptions et chausse-trapes. Par exemple, la recherche non qualifiée est utilisée pour déterminer les éléments suivants si le nom est utilisé comme un appel de fonction, par opposition à une expression cast, avant que ADL ne soit utilisé pour générer une liste de surcharges potentielles. La recherche non qualifiée ne recherche pas les objets dans les périmètres englobants des classes locales ou imbriquées, car ces objets peuvent ne pas exister au moment de la référence.

Faites preuve de bon sens et posez des questions plus précises lorsque (comme c'est souvent le cas) l'intuition fait défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X