C++ Quali funzioni sono state trovate


Esempio

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 è un ClassTemplate<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 a U o array di U , le classi e gli spazi dei nomi associati a U Esempio: void (*fptr)(A); f(fptr); , include gli spazi dei nomi e le classi associate a void(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 ad A
  • 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 a A , 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!