Ответ 1
Это называется Поиск зависимых аргументов (или поиск Koenig)
В принципе, если символ не может быть разрешен, компилятор будет искать пространство имен (ов) аргумента (ов).
Второй вызов функции завершается с ошибкой, потому что strangeFn2
не отображается в текущем пространстве имен, и не определено в пространстве имен этого типа параметра (int
)
Вы можете видеть, как это хорошо работает с функциями оператора:
std::complex<double> c, d;
c += d; // wouldn't really work without ADL
или вездесущие операторы iostream:
std::string s("hello world");
std::cout << s << std::endl; // Hello world would not compile without ADL...
Для удовольствия, это то, что мир привет будет выглядеть без ADL (и без ключевого слова using
...):
std::string s("hello world");
std::operator<<(std::cout, s).operator<<(std::endl); // ugly!
Есть тенистые угловые случаи с ADL и разрешением перегрузки при наличии шаблонов функций, но я оставлю их вне области ответа на данный момент.