Wie wird die Suche nach nicht qualifizierten Namen für Namen ausgeführt, die im Funktionsblock des Freundes verwendet werden? Lassen Sie sich den folgenden Code betrachten:Freundesfunktionen und statische Datenelemente
#include <iostream>
void foo();
class A
{
friend void foo(){ std::cout << a << std::endl; }
static int a;
};
int A::a = 10;
int main(){ foo(); }
Die Standard-Staaten in den 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.
Also, ich nicht qualifizierte Namen-Suche nicht zu erwarten, A::a
das finden, aber es tat. Ich habe absichtlich die A::a
Erklärung nach der Funktionsdefinition des Freundes in der Hoffnung gestellt, dass es nicht gefunden würde. Was ist die eigentliche Regel für die Suche nach einem nicht qualifizierten Namen eines Freundes?
Ordentlich Frage; Ich nehme an, dass es mit der Tatsache zu tun hat, dass es ein Freund ist, also kann es auf in-scope-Mitglieder von "A" zugreifen, während es immer noch im direkten Elternbereich ist. Ich habe das nie vorher in Betracht gezogen. interessanter Fund – Qix
Es besteht keine Beziehung zwischen der 'friend'-Deklaration und der' static' Membervariable. Ich weiß nicht, warum du denkst, dass sie verwandt sind. –
@RSahu Ich fragte nur nach unqualifizierten Namenssuche für statische Datenmitglieder weil wir nicht-ststaic Mitglieder innerhalb der Funktion bod der Freunde direkt verwenden können. –