www friendship and c++ friend

c++ - friendship - Algunas funciones de amigo no siguen la regla



virtual class c++ (1)

"No visible" es un poco de simplificación excesiva. Con solo una definición en clase, no se puede encontrar una función de amigo por búsqueda calificada o no calificada, por lo que el primer fragmento de código falla.

Sin embargo, se puede encontrar por búsqueda dependiente de argumento (ADL), por lo que puede llamarlo con un argumento que involucre un tipo que esté dentro del mismo espacio de nombres que la función.

En este caso, el tipo de argumento es B* , con ámbito en el espacio de nombres global. La función de amigo tiene un ámbito en el espacio de nombres que contiene la clase que lo declara, también el espacio de nombres global. Por lo tanto, ADL buscará en el espacio de nombres global las funciones llamadas f , buscará la función amiga y la usará.

Para el siguiente fragmento de código:

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

De acuerdo con la regla de que aunque las funciones de un amigo pueden definirse dentro de una clase, no son visibles hasta que se declaran en algún lugar fuera del alcance de la clase, se explica el error en la definición de la clase A.
Pero estoy confundido de por qué el fragmento de código de la clase B no produce el mismo error que el de la clase A.

Por favor, ¿alguien puede decirme sobre esto?