Recherche…


Quelles fonctions sont trouvées

Les fonctions se trouvent d'abord en collectant un ensemble de "classes associées" et "espaces de noms associés" qui incluent un ou plusieurs des éléments suivants, en fonction du type d'argument T Tout d'abord, montrons les règles pour les noms de classes, d'énumération et de template de classe.

  • Si T est une classe imbriquée, l'énumération des membres, puis la classe qui l'entoure.
  • Si T est une énumération (il peut aussi s'agir d'un membre de classe!), Son espace de noms le plus interne.
  • Si T est une classe (il peut aussi être imbriqué!), Toutes ses classes de base et la classe elle-même. L'espace de noms le plus interne de toutes les classes associées.
  • Si T est un ClassTemplate<TemplateArguments> (c'est aussi une classe!), Les classes et espaces de noms associés aux arguments de type modèle, l'espace de noms de tout argument de modèle de modèle et la classe environnante de tout argument de modèle, un modèle de membre.

Il existe maintenant quelques règles pour les types intégrés.

  • Si T est un pointeur sur U ou tableau de U , les classes et espaces de noms associés à U Exemple: void (*fptr)(A); f(fptr); , inclut les espaces de noms et les classes associés à void(A) (voir la règle suivante).
  • Si T est un type de fonction, les classes et espaces de noms associés aux types de paramètre et de retour. Exemple: void(A) comprend les espaces de noms et les classes associés à A
  • Si T est un pointeur sur un membre, les classes et les espaces de noms associés au type de membre (peuvent s'appliquer à la fois aux fonctions de pointeur et à celles de membre de données!). Exemple: BA::*p; void (A::*pf)(B); f(p); f(pf); inclut les espaces de noms et les classes associés à A , B , void(B) (qui applique la puce ci-dessus pour les types de fonctions).

Toutes les fonctions et tous les modèles de tous les espaces de noms associés sont détectés par une recherche dépendante des arguments. De plus, on trouve des fonctions d'ami d'espace de nommage et d'étendue déclarées dans les classes associées , qui ne sont normalement pas visibles. L'utilisation des directives est cependant ignorée.

Tous les exemples d'appels suivants sont valides, sans qualifier f par le nom de l'espace de nom dans l'appel.

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!


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow