2017-02-22 4 views
2

Si une fonction ne peut pas être trouvée dans la portée où elle est appelée, la recherche dans les espaces de noms de ses arguments suivra. J'ai quelques questions.recherche de fonction et espaces de noms

  1. S'il existe plusieurs arguments dans des espaces de noms différents, quel espace de noms sera d'abord recherché? Est-ce l'espace de noms du premier argument?

    f(A::T t, B:U u); // Is namespace A looked up first? 
    
  2. Plus complexe pour les classes de modèle, comme

    f(A::T<B::U> t); // Namespace A or B is looked up first? 
    

Répondre

5

En fait, il n'y a pas d'ordre parmi les namespaces pour ADL. Tous les espaces de noms pertinents sont recherchés et toutes les fonctions ainsi trouvées forment l'ensemble des candidats pour la résolution de surcharge.

Notez également que contrairement à ce que vous dites dans la question, ADL est effectuée même lorsqu'une fonction est trouvée par une recherche non qualifiée dans la portée d'appel. L'union de la recherche non qualifiée et de l'ADL est ensuite utilisée pour trouver la meilleure surcharge. ADL est seulement supprimé si la recherche non qualifiée à l'étendue d'appel trouve un membre de classe, une non-fonction ou une déclaration de bloc-portée non using.

Les règles pertinentes sont en C++ 14 3.4.2 [basic.lookup.argdep]. Citant N4140, Souligné par l'auteur gras:

3 Soit X l'ensemble de recherche produit par consultation non qualifiée (3.4.1) et nous Y l'ensemble de recherche produit dépend par argument de recherche (défini comme suit). Si X contient

  • une déclaration d'un membre de la classe, ou
  • une déclaration de fonction portée de bloc qui n'est pas à l'aide-déclaration, ou
  • une déclaration qui ne soit ni une fonction ou une fonction modèle

puis Y est vide. Sinon Y est l'ensemble des déclarations trouvées dans les espaces de noms associés aux types d'argument comme décrit ci-dessous. L'ensemble des déclarations trouvées par la recherche du nom est l'union de X et Y.