#include <iostream>
namespace Foo
{
class Baz { };
std::ostream& operator<< ( std::ostream& ostream , const Baz& baz )
{
return ostream << "operator<<\n";
}
}
int main()
{
std::cout << Foo::Baz();
}
Я определяю operator<<
в Foo
Пространство имен. Почему это можно назвать из глобальной области?
DRTL
Компилятор может найти пользовательский operator<<
через зависимый от аргумента поиск.
объяснение
Вызов
std::cout << Foo::Baz();
на самом деле сокращение для инфикса
operator<<(std::cout, Foo::Baz());
Потому что вызов функции неквалифицированный (т.е. без префикса пространства имен или окружающих скобок), компилятор не только сделает обычное имя поиска (наружу из области видимости локальной функции), но также зависящий от аргументов поиск (a.k.a ADL) для других перегрузок функции operator<<
во всех связанные пространства имен обоих аргументов std::cout
и класс Baz
, Эти связанные пространства имен std
а также Foo
в этом случае.
Таким образом, аргумент-зависимый поиск найдет определения
std::operator<<(std::ostream&, /* all the builtin types and Standard strings and streams */)
Foo::operator<<(std::ostream&, const& Baz)
После поиска имени, аргумент вычета потерпит неудачу для всех std::operator<<
Перегрузки. Вот почему разрешение перегрузки обнаружит, что пользовательский Foo::operator<<
на самом деле единственный матч. Вот почему это называется.
Других решений пока нет …