Domanda

Qual è la logica di Koenig?

Non si può evitare di pensare di esso come qualcosa che rende il codice molto più difficile da leggere e più instabile .

Non potevano definire Koenig in modo che il lavoro solo per casi specifici? (Ad esempio: operatori terzi) o quando esplicitamente richiesto

È stato utile?

Soluzione

La motivazione originale, IIRC, è stato quello di essere in grado di scrivere

std::cout << 42;

senza dover qualificare std::operator<<(std::ostream&, int) esplicitamente.

Se si desidera disabilitare argomento di ricerca dipendente, si può esplicitamente qualificare il nome della funzione, vale a dire. uso std::swap invece di swap per evitare swap da alzò gli occhi in qualsiasi spazio dei nomi i suoi argomenti vivrebbero.

ADL può essere utilizzato anche con SFINAE di prova al momento della compilazione se alcuni funzione è definita per un determinato tipo (vi svelo lavorare questo fuori come un esercizio, non v'è almeno una domanda su questo su StackOverflow).

Altri suggerimenti

Il caso d'uso più forte per ADL è per casi come questo.

namespace A
{
    struct S {};
    S operator+( const S&, const S& );
}

namespace B
{
    A::S test()
    {
        A::S a, b;
        return a + b;
    }
}

E 'anche utile per selezionare la funzione swap corretto codice generico e quindi dovrebbe applicarsi non solo alle funzioni operator. E 'già una parte abbastanza complessa dello standard, rendendo regole che impedivano di lavorare in alcuni casi aggiungerebbe ulteriore complessità, quale sarebbe il guadagno?

Non riesco a pensare a un modo ordinato di chiedere esplicitamente che sarebbe significativamente meno prolissa di chiamare una funzione in uno spazio dei nomi diverso direttamente e sarebbe, in ogni caso, make espressioni più complesso.

Stiamo pensando qualcosa del tipo:? return [[ use_adl ]] (a + b); vs return A::operator+( a, b );

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top