Justificación de la búsqueda Koenig
-
25-09-2019 - |
Pregunta
¿Cuál es la razón de ser de búsqueda Koenig?
No se puede dejar de pensar en ello como algo que hace que su código mucho más difícil de leer y más inestable .
¿No podían definir Koenig de búsqueda de modo que sólo el trabajo para casos específicos? (Es decir: los operadores no miembros) o cuando es requerido explícitamente
Solución
La motivación original, IIRC, iba a ser capaz de escribir
std::cout << 42;
sin tener que calificar std::operator<<(std::ostream&, int)
explícitamente.
Si desea desactivar las operaciones de búsqueda depende argumento, se puede calificar explícitamente el nombre de la función, es decir. std::swap
uso en lugar de swap
para evitar swap
que desea consultar en cualquier espacio de nombres de sus argumentos vivirían.
ADL también se puede utilizar con SFINAE a prueba en tiempo de compilación si alguna función está definida para un tipo particular (Voy a dejar de trabajar esto como un ejercicio, hay por lo menos una pregunta acerca de esto en Stackoverflow).
Otros consejos
El caso de uso más fuerte para las AVD es para casos como este.
namespace A
{
struct S {};
S operator+( const S&, const S& );
}
namespace B
{
A::S test()
{
A::S a, b;
return a + b;
}
}
También es útil para seleccionar la función correcta en swap
código genérico por lo que no sólo debe aplicarse a las funciones operator
. Ya es una parte bastante compleja de la norma, por lo que las reglas que le impidieron trabajar en algunos casos sería añadir más complejidad, ¿cuál sería la ganancia?
No se me ocurre ninguna forma elegante de pedir explícitamente que sería significativamente menos detallado que llamar a una función en un espacio de nombres diferente manera directa y sería, en cualquier caso, las expresiones hacer más compleja.
Estamos pensando algo como:? return [[ use_adl ]] (a + b);
vs return A::operator+( a, b );