Definiuje operator<<
w przestrzeni nazw Foo
. Dlaczego można go nazwać globalnym zasięgiem?Zrozumienie zakresu operatorów w C++
Odpowiedz
DRTL
Kompilator może znaleźć zdefiniowany przez użytkownika operator<<
przez argumentu zależne odnośnika.
Wyjaśnienie
Wezwanie
std::cout << Foo::Baz();
jest właściwie skrótem infix dla
operator<<(std::cout, Foo::Baz());
Ponieważ wywołanie funkcji jest niewykwalifikowany (czyli bez przedrostka przestrzeni nazw lub okolic nawiasach), kompilator nie tylko wykona zwykłe wyszukiwanie nazw (na zewnątrz z lokalnym zakresie funkcji), ale również odnośników argumentem zależne (a.k.a ADL) dla innych przeciążeń funkcji operator<<
we wszystkich związanych nazw z obu argumentów std::cout
i klasy Baz
się. Te powiązane przestrzenie nazw są w tym przypadku std
i Foo
.
odnośnika Zatem argument, zależny będzie znaleźć definicje
std::operator<<(std::ostream&, /* all the builtin types and Standard strings and streams */)
Foo::operator<<(std::ostream&, const& Baz)
Po imienin odnośnika, odliczenie argumentem zawiedzie dla wszystkich std::operator<<
przeciążeń. Właśnie dlatego rozdzielczość przeciążania wykryje, że zdefiniowany przez użytkownika Foo::operator<<
jest w rzeczywistości jedynym dopasowaniem. Dlatego tak się nazywa.
TemplateRex, dziękuję bardzo za kompleksową odpowiedź! – Kolyunya
@Kolyunya Cieszę się, że mogłem pomóc! – TemplateRex