2015-07-19 29 views
14

Funkcja przyjazna f nie ma dostępu do prywatnego elementu klasy otaczającej A.Wierzę, że błędnie pozwala błędnie zezwalać inline przyjacielowi na dostęp do danych w zakresie obejmującym. Zarówno gcc, jak i vs2013 odrzucają ten kod.

#include <iostream> 

class A{ 
    const static int p = 1; 
    class B { 
     friend void f() { 
      std::cout << p << '\n'; 
      std::cout << q << '\n'; 
     } 
    }; 
public: 
    const static int q = 2; 
}; 
void f(); 

int main() 
{ 
    f(); 
} 

Przynajmniej to co myślę [class.nest]/4 w N4140 mówi (patrz niżej).

§9.7/4

Jak metodę, to funkcja przyjaciela (11,3) określony w zagnieżdżonej klasy jest w zakresie słownikowego z tej grupy; działa zgodnie z tymi samymi regułami dotyczącymi powiązania nazw jak statyczna funkcja członkowska tej klasy (9.4), ale nie ma specjalnych praw dostępu dla członków otaczającej klasy .

live example

+0

Czy należy opracować, nie Clang pozwoli go ale z drugiej daje błędy? Jakie jest Twoje pytanie? –

+0

Tak, zgadza się. Chciałbym tylko uzyskać potwierdzenie tego. – Belloc

+0

Masz rację. To musi być błąd w sposobie, w jaki klang wdrożył przyjaciół –

Odpowiedz

4

wierzę, że masz rację, w tym zarówno Visual Studio i GCC prawidłowo odrzucić kod na podstawie cytowanego wy spec. Clang wydaje się być błędny, umożliwiając dostęp do prywatnej zmiennej A użytkownika p z funkcji znajomego f(), ponieważ f() jest przyjacielem B, a nie A.

dla dobrej dyskusji zakresu funkcji przyjaciel, zobacz top-głosowało odpowiedź w następujących SO postu: What's the scope of inline friend functions