2011-01-05 12 views
6

¿Cuál es la lógica de la búsqueda de Koenig?Justificación para la búsqueda de Koenig

No se puede evitar pensar en ello como algo que hace que su código sea mucho más difícil de leer y más inestable.

¿No pudieron definir la búsqueda Koenig para que solo funcione para casos específicos (es decir, operadores no miembros) o cuando se requiera explícitamente?

+0

Nunca pensé en eso. Entonces incluso quiero saber eso. ¡Buena pregunta! – Nawaz

Respuesta

5

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 deshabilitar la búsqueda dependiente del argumento, puede calificar explícitamente el nombre de la función, es decir. utilice std::swap en lugar de swap para evitar que swap se busque en el espacio de nombres en el que vivan sus argumentos.

ADL también se puede usar con SFINAE para probar en tiempo de compilación si alguna función está definida para un tipo particular (le dejaré resolver esto como un ejercicio, hay al menos una pregunta sobre esto en Stackoverflow).

+0

Creo que SFINAE se concibió después de la introducción de ADL. Mi punto de todos modos es que me gustaría ser forzado a decir explícitamente qué espacio de nombres usar (o decir explícitamente que apliquen ADL). ... Estaba explicando un fragmento de código que escribí a un amigo mío que no habla en C++; después de pasar diez minutos hablando de espacios de nombres, me preguntó por qué, en mi fragmento de código, podía usar una función de otro espacio de nombres sin hacerlo explícito.Soné como "oh, bueno, sí, porque C++ también tiene esta otra regla que ..." – peoro

+0

@ peoro: C++ tiene muchas reglas raras, y esto va a empeorar con C++ 0x. Sin embargo, creo que es mejor evitar ADL llamando explícitamente a las funciones miembro con 'this->' y usando calificaciones explícitas siempre que tenga sentido. La mayoría de las veces, no es necesario (excepto con las llamadas a función de miembro). Y hay momentos en que ADL es genial. –

+0

@Alexandre C .: Sí, sé que se puede evitar de esa manera, pero eso no responde por qué existe ADL. Pensé (esta es mi opinión personal, sí) hubiera sido más simple y más limpio no tenerlo, y haberme visto obligado a evitarlo. ¿En qué casos es genial? Por el momento, lo veo como una extraña regla de C++ que podría evitarse fácilmente en un lenguaje con una buena sintaxis. – peoro

3

El caso de uso más fuerte para ADL 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 operator funciones. Ya es una parte bastante compleja del estándar, por lo que las reglas que le impidieron trabajar en algunos casos agregarían complejidad adicional, ¿cuál sería la ganancia?

No puedo pensar en ninguna manera ordenada de preguntar explícitamente que sería mucho menos detallado que llamar directamente a una función en un espacio de nombre diferente y, en cualquier caso, hacer las expresiones más complejas.

Estamos pensando algo así como: return [[ use_adl ]] (a + b); contra return A::operator+(a, b);?

+0

En realidad, estaba pensando en agregar algún tipo de palabra clave dentro de la función que utiliza la búsqueda de koenig: 'void f (const T & a) {namespaceof (T) :: ...; } '... – peoro

+2

@peroro:' namespaceof (T) 'suena como si estuvieras especificando un espacio de nombre particular para buscar; en cuyo caso no necesita ADL en absoluto. También puede usar una identificación calificada. –

+0

@Charles Bailey: Sí, pero mi pregunta sigue ahí. ¿No sería más simple (para los compiladores y para el estándar) y más limpio (para los programadores y para el estándar) tener un operador como 'namespaceof' en lugar de ADL, y verse forzado a usar explícitamente el espacio de nombres? – peoro

Cuestiones relacionadas