функция — Понимание области действия операторов в переполнении стека

#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 Пространство имен. Почему это можно назвать из глобальной области?

5

Решение

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<< на самом деле единственный матч. Вот почему это называется.

9

Другие решения

Других решений пока нет …