Ответ 1
"Не видно" - это немного упрощенное. С помощью только определения в классе функция друга не может быть найдена с помощью квалифицированного или неквалифицированного поиска, поэтому первый фрагмент не работает.
Однако его можно найти с помощью зависящего от аргумента поиска (ADL), поэтому вы можете вызвать его с аргументом, включающим тип, охваченный в том же пространстве имен, что и функция.
В этом случае тип аргумента B*
, ограниченный глобальным пространством имен. Функция friend помещается в пространство имен, содержащее класс, объявляющий его, а также глобальное пространство имен. Поэтому ADL будет искать в глобальном пространстве имен функции f
, найти функцию друга и использовать ее.