C++ Ricerca dipendente dall'argomento


Esempio

Quando si chiama una funzione senza un qualificatore di namespace esplicito, il compilatore può scegliere di chiamare una funzione all'interno di uno spazio dei nomi se uno dei tipi di parametro di quella funzione è anche in quello spazio dei nomi. Questo è chiamato "Argument Dipendent Lookup", 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 fallisce perché nessuno dei suoi tipi di parametro proviene dallo spazio dei nomi Test . call_too funziona perché SomeClass è un membro di Test e pertanto si qualifica per le regole ADL.

Quando non si verifica ADL

ADL non si verifica se la normale ricerca non qualificata trova un membro della classe, una funzione che è stata dichiarata nell'ambito di un blocco o qualcosa che non è di tipo funzione. Per esempio:

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"
}