Considérant cet exemple décrit dans http://en.cppreference.com/w/cpp/language/adl:C++ recherche ordinaire vs recherche dépendante de l'argument
namespace A {
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B {
void f(int i) {
f(i); // calls B::f (endless recursion)
}
void g(A::X x) {
g(x); // Error: ambiguous between B::g (ordinary lookup)
// and A::g (argument-dependent lookup)
}
void h(A::Y y) {
h(y); // calls B::h (endless recursion): ADL examines the A namespace
// but finds no A::h, so only B::h from ordinary lookup is used
}
}
Je me demande pourquoi l'ambiguïté apparaît puisque les règles ADL ne sont pas prises en compte si
« la recherche L'ensemble produit par la recherche habituelle non qualifiée contient l'un des éléments suivants ".
ici B :: g peut être trouvée en recherche non qualifié comme expliqué dans http://en.cppreference.com/w/cpp/language/unqualified_lookup grâce à la règle
Pour un nom utilisé dans la définition d'une fonction, que ce soit dans son corps ou dans le cadre de argument par défaut, où la fonction est un membre de l'espace de noms déclaré par l'utilisateur ou global, le bloc dans lequel le nom est utilisé est recherché avant l'utilisation du nom, puis le bloc englobant est recherché avant le début de ce bloc, etc. atteindre le bloc qui est le corps de la fonction. Ensuite, l'espace de noms dans lequel la fonction est déclarée est recherchée jusqu'à ce que la définition (pas nécessairement la déclaration) de la fonction qui utilise le nom, puis les encaissantes espaces de noms, etc.
Alors ma question est pourquoi sont les règles ADL considérés comme dans ce cas?
Pourriez-vous expliquer pourquoi vous pensez qu'il ne devrait pas être pris en compte? – cpplearner
Tout d'abord, la recherche dépendant de l'argument n'est pas prise en compte si l'ensemble de recherche produit par la recherche non qualifiée habituelle contient: – FlashMcQueen
1) une déclaration d'un membre de classe 2) une déclaration d'une fonction à la portée du bloc (ce n'est pas un using-declaration) 3) toute déclaration qui n'est pas une fonction ou un modèle de fonction (par exemple un objet fonction ou une autre variable dont le nom est en conflit avec le nom de la fonction recherchée) – FlashMcQueen