Koenig de Recherche est également connue comme Argument Dépendante de Recherche en C++ et la plupart de la Norme compilateurs C++ en charge.
Le C++11 standard § 3.4.2/1 membres:
Lorsque le suffixe-expression dans un appel de fonction (5.2.2) est un franc-id, d'autres espaces de noms pas considérés lors de l'habituelle non qualifiés de recherche (3.4.1) peuvent être recherchés, et dans les espaces de noms, de noms-portée ami déclarations de fonction (11.3), non visible peut être trouvé. Ces modifications à la recherche dépendent des types d'arguments (et pour le modèle arguments de modèle, l'espace de noms du modèle
l'argument).
En termes plus simples, Nicolai Josuttis états1:
Vous n'avez pas à qualifier l'espace de noms de fonctions, si un ou plusieurs types d'arguments sont définis dans l'espace de nom de la fonction.
Un exemple de code simple:
namespace MyNamespace
{
class MyClass {};
void doSomething(MyClass);
}
MyNamespace::MyClass obj; // global object
int main()
{
doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.
}
Dans l'exemple ci-dessus il n'y a ni using-declaration
ni using-directive
, mais le compilateur identifie correctement le nom non qualifié doSomething()
que la fonction déclarée dans l'espace de noms MyNamespace
par l'application de l' Koenig algorithme.
Comment ça fonctionne?
L'algorithme indique au compilateur de ne pas seulement regarder une portée locale, mais aussi les espaces de noms qui contiennent de l'argument type. Ainsi, dans le code ci-dessus, le compilateur trouve que l'objet obj
, ce qui est l'argument de la fonction doSomething()
, appartient à l'espace de noms MyNamespace
. Ainsi, il semble à l'espace de noms pour localiser la déclaration d' doSomething()
.
Quel est l'avantage d' Koenig Lookup
?
Le simple exemple de code ci-dessus montre au-dessus de la Koenig Algorithme fournit la commodité et la facilité d'utilisation pour le programmeur. Sans Koenig Algorithme il y aurait une surcharge sur le programmeur, à plusieurs reprises spécifier les noms entièrement qualifiés, ou plutôt de les utiliser de nombreux, à l'aide de déclarations.
Pourquoi la critique de l' Koenig Algorithm
?
La dépendance par rapport au Koenig Algorithme peut conduire à des problèmes sémantiques,et attraper le programmeur hors garde parfois.
Prenons l'exemple de std::swap, qui est une bibliothèque standard de l'algorithme pour échanger deux valeurs. Avec l'Koenig algorithme il faut être prudent lors de l'utilisation de cet algorithme, car:
std::swap(obj1,obj2);
ne peut pas afficher le même comportement que:
using std::swap;
swap(obj1, obj2);
Avec l'ADL, la version de swap
fonction est appelée dépendra de l'espace de noms des arguments passés.
S'il existe un espace de noms A
et si A::obj1
, A::obj2
& A::swap()
, alors que le deuxième exemple se traduit par un appel à l' A::swap()
ce qui pourrait ne pas être ce que l'utilisateur veut.
De plus, si pour une raison tout à la fois:
A::swap(A::MyClass&, A::MyClass&)
et std::swap(A::MyClass&, A::MyClass&)
sont définies, puis le premier exemple appellera std::swap(A::MyClass&, A::MyClass&)
, mais la seconde ne sera pas compiler, car swap(obj1, obj2)
d'être ambigu.
Trivia:
Pourquoi est-il appelé Koenig Lookup
?
Parce qu'il a été conçu par l'ancien AT&T et Bell Labs chercheur et programmeur,Andrew Koenig.
Bonnes Lectures:
Herb Sutter est à la Recherche d'un Nom sur GotW
Standard C++03/11 [de base.de recherche.argdep]: 3.4.2 Argument dépendant de recherche de nom.
1 La définition de Koenig Algorithme est tel que défini dans Josuttis du livre, Le C++ Standard Library: Un Tutoriel et de Référence.