Sök…


Vilka funktioner finns

Funktioner hittas genom att först samla en uppsättning "associerade klasser" och "tillhörande namnutrymmen" som innehåller en malm mer av följande, beroende på argumenttypen T Låt oss först visa reglerna för klasser, uppräkning och klassmallspecialiseringsnamn.

  • Om T är en kapslad klass, medlemsuppräkning, så är den omgivande klassen av den.
  • Om T är en uppräkning (det kan också vara en klassmedlem!), Är det innersta namnområdet.
  • Om T är en klass (det kan också vara kapslad!), Alla dess basklasser och klassen själv. Det innersta namnområdet för alla associerade klasser.
  • Om T är ett ClassTemplate<TemplateArguments> (detta är också en klass!), Klasserna och namnområdena som är associerade med malltypargumenten, namnområdet för ett mallmallargument och den omgivande klassen för ett mallmallargument, om ett mallargument är en medlemsmall.

Nu finns det några regler för inbyggda typer också

  • Om T är en pekare till U eller matris av U , klasser och namnutrymmen som är associerade med U Exempel: void (*fptr)(A); f(fptr); , inkluderar namnområdena och klasserna som är associerade med void(A) (se nästa regel).
  • Om T är en funktionstyp, klasser och namnutrymmen associerade med parameter- och returtyper. Exempel: void(A) skulle inkludera namnutrymmen och klasser associerade med A
  • Om T är en pekare till medlem kan klasserna och namnutrymmen som är associerade med medlemstypen (gälla både pekaren för medlemsfunktioner och pekaren för datamedlem!). Exempel: BA::*p; void (A::*pf)(B); f(p); f(pf); inkluderar namnområdena och klasserna som är associerade med A , B , void(B) (som gäller kula ovan för funktionstyper).

Alla funktioner och mallar inom alla tillhörande namnutrymmen hittas genom argumentberoende sökning. Dessutom hittas namnutrymme-vänfunktioner som deklarerats i tillhörande klasser , som normalt inte är synliga. Att använda direktiv ignoreras dock.

Alla följande exempel samtal är giltiga, utan kvalificerade f med namnutrymmet namn i samtalet.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow