Razionale per Koenig
-
25-09-2019 - |
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
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 );