C++ Búsqueda dependiente del argumento


Ejemplo

Cuando se llama a una función sin un calificador de espacio de nombres explícito, el compilador puede elegir llamar a una función dentro de un espacio de nombres si uno de los tipos de parámetros para esa función también se encuentra en ese espacio de nombres. Esto se denomina "búsqueda dependiente de argumentos" o ADL:

namespace Test
{
  int call(int i);

  class SomeClass {...};

  int call_too(const SomeClass &data);
}

call(5); //Fails. Not a qualified function name.

Test::SomeClass data;

call_too(data); //Succeeds

call falla porque ninguno de sus tipos de parámetros proviene del espacio de nombres de Test . call_too funciona porque SomeClass es miembro de Test y, por lo tanto, califica para las reglas ADL.

¿Cuándo no se produce ADL?

ADL no se produce si la búsqueda normal no cualificada encuentra un miembro de la clase, una función que se ha declarado en el ámbito del bloque o algo que no es del tipo de función. Por ejemplo:

void foo();
namespace N {
    struct X {};
    void foo(X ) { std::cout << '1'; }
    void qux(X ) { std::cout << '2'; }
}

struct C {
    void foo() {}
    void bar() {
        foo(N::X{}); // error: ADL is disabled and C::foo() takes no arguments
    }
};

void bar() {
    extern void foo(); // redeclares ::foo
    foo(N::X{});       // error: ADL is disabled and ::foo() doesn't take any arguments
}

int qux;

void baz() {
    qux(N::X{}); // error: variable declaration disables ADL for "qux"
}