Подтвердить что ты не робот

Некоторые функции друга не следуют правилу

Для следующего фрагмента:

class A{
    friend void f(){};
    public:
        A(){f();} //error
};

class B{
    friend void f(void* ptr){};
    public:
        B(){f(this);} //no error
};

Согласно правилу, хотя функции друга могут быть определены внутри класса, но они не видны до тех пор, пока они не будут объявлены где-то вне области класса, ошибка в объясняется определение класса A. Но я смущен, почему фрагмент для класса B не создает ту же ошибку, что и класс A.

Пожалуйста, расскажите мне об этом?

4b9b3361

Ответ 1

"Не видно" - это немного упрощенное. С помощью только определения в классе функция друга не может быть найдена с помощью квалифицированного или неквалифицированного поиска, поэтому первый фрагмент не работает.

Однако его можно найти с помощью зависящего от аргумента поиска (ADL), поэтому вы можете вызвать его с аргументом, включающим тип, охваченный в том же пространстве имен, что и функция.

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