Ho difficoltà a capire le regole dietro la ricerca dipendente da argomenti (Koenig).Ricerca dipendente da argomenti: quando viene eseguita la ricerca e in che modo è possibile forzarla (o impedirla)?
Si consideri il codice qui sotto:
#include <iostream>
using namespace std;
namespace adl
{
struct Test { };
void foo1(Test const &) { cout << "ADL used (foo1)" << endl; }
void foo2(Test const &) { cout << "ADL used (foo2)" << endl; }
void foo3(Test const &) { cout << "ADL used (foo3)" << endl; }
}
struct foo1
{
foo1() { }
template<class T>
foo1(T const &) { cout << "ADL not used (foo1)" << endl; }
template<class T>
void operator()(T const &) const { cout << "ADL not used (foo3)" << endl; }
};
template<class T> void foo2(T const &)
{ cout << "ADL not used (foo2)" << endl; }
int main()
{
adl::Test t;
foo1 foo3;
(foo1(t));
(foo2(t));
(foo3(t));
}
La sua uscita è:
ADL non utilizzato (
foo1
)
ADL utilizzato (foo2
)
ADL non utilizzato (foo3
)
I e li ho osservati tutti per usare ADL, ma sono rimasto sorpreso che solo alcuni di loro l'abbiano fatto.
Quali sono i (potenzialmente cruenti, lo so) dettagli dietro le regole di ADL?
Capisco abbastanza bene il concetto, ma i dettagli sono ciò che sto avendo problemi con.
Quali ambiti vengono cercati, quando vengono cercati e quando non vengono cercati?
E 'del tutto possibile dire se ADL viene utilizzato senza dover guardare attraverso tutti i #include
'd file prima linea data di codice? Mi aspettavo che i funtori e le funzioni si comportassero allo stesso modo in termini di ADL mascherante, ma a quanto pare non lo fanno.
C'è un modo per forza ADL nei casi in cui non viene eseguito automaticamente (come sopra) e non si conosce lo spazio dei nomi della classe (ad esempio in un modello)?
-1 Questa domanda è troppo ampia e l'esempio di codice fa davvero schifo (con nomi fuorvianti, ecc.). –
Non capisco. Perché stai sperimentando con '(foo3 (t));'? Non esiste una funzione chiamata 'foo3'. Quindi ADL non entra in scena. 'foo3' sarà trattato come oggetto, senza alcun dubbio, perché è quello che è (il che significa che chiamerà l'operatore') senza alcun dubbio)! Sono solo nomi fuorvianti che hai usato nel tuo esempio. – Nawaz
@ Cheersandhth.-Alf: Ma non c'è confusione su '(foo3 (t));'. È solo che ha usato nomi fuorvianti per la variabile! – Nawaz