C++
Argumentberoende namnuppslag
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 ettClassTemplate<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 tillUeller matris avU, klasser och namnutrymmen som är associerade medUExempel:void (*fptr)(A); f(fptr);, inkluderar namnområdena och klasserna som är associerade medvoid(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 medA - 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 medA,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