argument dependent name lookup
Bonjour tout le monde,
est-ce que quelqu'un aurait une idée du "pourquoi" de cette ... chose?
Je m'explique.
Considérons le code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| // code trouvé sur http://www.mycppquiz.com mais un peu modifié
#include <iostream>
namespace standards
{
struct datastructure
{
};
void foo(const datastructure& ds)
{
}
}
int main(int argc, char** argv)
{
standards::datastructure ds;
foo(ds);
return 0;
} |
Et bien ce code fonctionne. C'est à dire que malgré qu'on appelle la fonction foo en dehors du namespace et sans le spécifier, le compilateur trouve quand-même la fonction à appeler. Grâce justement à ce fameux "argument dependent name lookup" (ou Koenig lookup). D'ailleurs comment doit-on traduire ça en français?
Si j'ai bien compris, le principe c'est qu'il parvient à identifier la fonction en utilisant le namespace de son paramètre.
Mais je trouve ça super nul en fait: à quoi bon utiliser des espaces de nommage si on peut les court-circuiter ainsi?
Et puis ça peut être dangereux non? On pourrait par exemple, porté par l'enthousiasme d'avoir savamment découpé notre programme en namespaces clairs et explicites, et implémenter 2 fonctions ayant le même nom, mais déclarées et définies dans des namespaces différents, et là c'est le drame: on ne peux jamais être vraiment certain de laquelle de ces 2 fonctions va être appelée finalement. Non?
Enfin, je voulais poster cette "réflexion" ici car j'imagine que si ça a été fait ainsi, en plus c'est dans le standard (3.4.2), il doit bien y avoir de bonnes raisons. En savez-vous plus sur ce sujet?