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:
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?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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?
Partager