C++
Ricerca del nome dipendente dall'argomento
Ricerca…
Quali funzioni sono state trovate
Le funzioni vengono trovate dapprima raccogliendo un insieme di "classi associate" e "spazi dei nomi associati" che includono uno o più dei seguenti, a seconda del tipo di argomento T
Per prima cosa, mostriamo le regole per i nomi delle classi di classi, di enumerazione e di classe.
- Se
T
è una classe nidificata, l'enumerazione dei membri, quindi la classe circostante di essa. - Se
T
è un'enumerazione (potrebbe anche essere un membro della classe!), Il namespace più interno di esso. - Se
T
è una classe (può anche essere annidata!), Tutte le sue classi base e la classe stessa. Lo spazio dei nomi più interno di tutte le classi associate. - Se
T
è unClassTemplate<TemplateArguments>
(questa è anche una classe!), Le classi e gli spazi dei nomi associati agli argomenti del tipo template, lo spazio dei nomi di qualsiasi argomento template template e la classe circostante di qualsiasi argomento template template, se un argomento template è un modello membro.
Ora ci sono anche alcune regole per i tipi built-in
- Se
T
è un puntatore aU
o array diU
, le classi e gli spazi dei nomi associati aU
Esempio:void (*fptr)(A); f(fptr);
, include gli spazi dei nomi e le classi associate avoid(A)
(vedi regola successiva). - Se
T
è un tipo di funzione, le classi e gli spazi dei nomi associati ai parametri e ai tipi di ritorno. Esempio:void(A)
include gli spazi dei nomi e le classi associati adA
- Se
T
è un puntatore al membro, le classi e gli spazi dei nomi associati al tipo di membro (possono applicarsi sia al puntatore alle funzioni membro che al puntatore al membro dati!). Esempio:BA::*p; void (A::*pf)(B); f(p); f(pf);
include gli spazi dei nomi e le classi associati aA
,B
,void(B)
(che applica bullet sopra per i tipi di funzione).
Tutte le funzioni e i modelli all'interno di tutti gli spazi dei nomi associati vengono trovati dalla ricerca dipendente dall'argomento. Inoltre, vengono trovate le funzioni degli amici dello scope dello spazio dei nomi dichiarate nelle classi associate , che normalmente non sono visibili. L'uso delle direttive viene tuttavia ignorato.
Tutte le seguenti chiamate di esempio sono valide, senza qualificare f
dal nome dello spazio dei nomi nella chiamata.
namespace A {
struct Z { };
namespace I { void g(Z); }
using namespace I;
struct X { struct Y { }; friend void f(Y) { } };
void f(X p) { }
void f(std::shared_ptr<X> p) { }
}
// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());
g(A::Z()); // invalid: "using namespace I;" is ignored!