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

¿Fue útil?

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 );

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top