2011-01-05 1 views
6

Quelle est la logique de Koenig lookup?Justification de la recherche Koenig

Ne peut pas éviter d'y penser comme quelque chose qui rend votre code beaucoup plus difficile à lire et plus instable.

Impossible de définir la recherche Koenig pour qu'elle ne fonctionne que pour des cas spécifiques (par exemple: opérateurs non membres) ou explicitement requise?

+0

Je n'y ai jamais pensé. Donc même je veux le savoir. Bonne question! – Nawaz

Répondre

5

La motivation initiale, IIRC, était de pouvoir écrire

std::cout << 42; 

sans avoir à se qualifier std::operator<<(std::ostream&, int) explicitement.

Si vous souhaitez désactiver la recherche dépendante des arguments, vous pouvez qualifier explicitement le nom de la fonction, c'est-à-dire. utilisez std::swap au lieu de swap pour empêcher que swap soit recherché dans l'espace de noms de ses arguments. ADL peut également être utilisé avec SFINAE pour tester au moment de la compilation si certaines fonctions sont définies pour un type particulier (je vous laisse travailler comme un exercice, il y a au moins une question à ce sujet sur Stackoverflow).

+0

Je pense que SFINAE a été conçu après l'introduction de l'ADL. Mon point de toute façon est que je voudrais être forcé de dire explicitement quel espace de noms utiliser (ou de dire explicitement d'appliquer ADL). ... J'expliquais un morceau de code que j'ai écrit à un de mes amis qui ne parle pas C++; Après avoir passé dix minutes à parler des espaces de noms, il m'a demandé pourquoi, dans mon morceau de code, je pouvais utiliser une fonction d'un autre espace de noms sans la rendre explicite.Je ressemblais plutôt à "oh, eh bien, oui, parce que C++ a aussi cette autre règle qui ..." – peoro

+0

@peoro: C++ a beaucoup de règles étranges, et cela va être pire avec C++ 0x. Cependant, je pense qu'il vaut mieux éviter l'ADL en appelant explicitement les fonctions membres avec 'this->' et en utilisant des qualifications explicites chaque fois que cela a du sens. La plupart du temps, vous n'en avez pas besoin (sauf avec les appels de fonctions membres). Et il y a des moments où ADL est génial. –

+0

@Alexandre C .: Oui, je sais que cela peut être évité de cette façon, mais cela ne répond pas aux raisons pour lesquelles ADL existe. Je pensais (ceci est mon opinion personnelle, oui) il aurait été plus simple et plus propre de ne pas l'avoir, et d'être obligé de l'éviter. Dans quels cas est-ce génial? En ce moment je le vois comme une règle étrange de C++ qui pourrait être facilement évitée dans un langage avec une bonne syntaxe. – peoro

3

Le cas d'utilisation le plus important pour les AVQ est pour les cas de ce genre.

namespace A 
{ 
    struct S {}; 
    S operator+(const S&, const S&); 
} 

namespace B 
{ 
    A::S test() 
    { 
     A::S a, b; 
     return a + b; 
    } 
} 

Il est également utile pour sélectionner la fonction swap correcte dans le code générique de sorte qu'il devrait appliquer non seulement aux operator fonctions. C'est déjà une partie assez complexe de la norme, en faisant des règles qui l'empêchaient de fonctionner dans certains cas ajouterait plus de complexité, quel serait le gain?

Je ne peux pas trouver de façon claire de le demander explicitement qui serait significativement moins prolixe que d'appeler directement une fonction dans un espace de noms différent et qui, dans tous les cas, rendrait les expressions plus complexes. Vous pensez quelque chose comme: return [[ use_adl ]] (a + b);return A::operator+(a, b);?

+0

En fait je pensais ajouter une sorte de mot-clé dans la fonction qui utilise la recherche koenig: 'void f (const T & a) {namespaceof (T) :: ...; } '... – peoro

+2

@peroro:' namespaceof (T) 'ressemble beaucoup à la spécification d'un espace de noms particulier à rechercher; Dans ce cas, vous n'avez pas du tout besoin d'ADL. Vous pouvez aussi bien utiliser un identifiant qualifié. –

+0

@Charles Bailey: Oui, mais alors ma question est toujours là. Ne serait-il pas plus simple (pour les compilateurs et pour la norme) et plus propre (pour les programmeurs et pour la norme) d'avoir un opérateur comme 'namespaceof' au lieu d'ADL, et d'être forcé d'utiliser explicitement l'espace de noms? – peoro

Questions connexes