2013-06-13 26 views

Odpowiedz

9

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.

+0

TemplateRex, dziękuję bardzo za kompleksową odpowiedź! – Kolyunya

+0

@Kolyunya Cieszę się, że mogłem pomóc! – TemplateRex