In che modo viene eseguita la ricerca del nome non qualificato per i nomi che utilizzano all'interno del corpo della funzione dell'amico? Consideriamo il seguente codice:Funzioni di amici e membri di dati statici
#include <iostream>
void foo();
class A
{
friend void foo(){ std::cout << a << std::endl; }
static int a;
};
int A::a = 10;
int main(){ foo(); }
La norma nella N4296::7.3.1.2/3 [namespace.memdef]
:
If a friend declaration in a non-local class first declares a class, function, class template or function template the friend is a member of the innermost enclosing namespace.
Quindi, mi aspettavo di ricerca del nome non qualificato non ha trovato A::a
, ma lo ha fatto. Ho deliberatamente inserito la dichiarazione A::a
dopo la definizione della funzione dell'amico nella speranza che non venga trovata. Qual è la regola effettiva per la ricerca del nome non qualificato del tuo amico?
domanda Neat; Sto * assumendo * che ha a che fare con il fatto che sia un amico, quindi è in grado di accedere ai membri dell'ambito di 'A' mentre è ancora inserito nell'oggetto del genitore diretto. Non l'ho mai considerato prima; scoperta interessante. – Qix
Non esiste alcuna relazione tra la dichiarazione 'friend' e la variabile membro' static'. Non so perché pensi che siano imparentati. –
@RSahu Ho appena chiesto informazioni sulla ricerca di nomi non qualificati per i membri di dati stattici. Non possiamo usare direttamente membri non ststaic all'interno della funzione di amici. –