Понимание области действия операторов в C++
#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
Пространство имен. Почему это можно назвать из глобальной области?
1 ответ
DRTL
Компилятор может найти пользовательский operator<<
через аргумент-зависимый поиск.
объяснение
Вызов
std::cout << Foo::Baz();
на самом деле сокращение от инфикса
operator<<(std::cout, Foo::Baz());
Поскольку вызов функции является неквалифицированным (то есть без префикса пространства имен или окружающих скобок), компилятор будет выполнять не только обычный поиск имени (вне области локальной функции), но также поиск, зависящий от аргумента (он же 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<<
на самом деле единственный матч. Вот почему это называется.