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 tillU
eller matris avU
, klasser och namnutrymmen som är associerade medU
Exempel: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