W jaki sposób przeprowadza się nieokreślone wyszukiwanie nazwy dla nazw używanych w ciele funkcji znajomego? Rozważmy następujący kod:Funkcje znajomych i statyczne elementy danych
#include <iostream>
void foo();
class A
{
friend void foo(){ std::cout << a << std::endl; }
static int a;
};
int A::a = 10;
int main(){ foo(); }
stanach standardowe w 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.
Tak, spodziewałem nazwa niewykwalifikowany odnośników nie znaleźliśmy A::a
, ale tak się stało. Rozmyślnie umieściłem deklarację A::a
po definicji funkcji znajomego w nadziei, że nie zostanie znalezione. Jaka jest rzeczywista reguła dla niewykwalifikowanego wyszukiwania nazwiska przyjaciela?
Neat pytanie; Zakładam, że * ma to związek z faktem, że jest to przyjaciel, więc może on uzyskać dostęp do członków "A" w ramach zakresu, pozostając jednocześnie w zasięgu bezpośredniego rodzica. Nigdy wcześniej tego nie rozważałem; ciekawe znalezisko. – Qix
Nie ma związku między deklaracją "przyjaciela" a zmienną składową "statyczną". Nie wiem, dlaczego uważasz, że są ze sobą spokrewnieni. –
@RSahu Właśnie zapytałem o niewykwalifikowane wyszukiwanie nazw dla członków danych statycznych, ponieważ nie możemy używać nie-stamatycznych członków bezpośrednio w funkcji bod przyjaciół. –