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 .
Czy należy opracować, nie Clang pozwoli go ale z drugiej daje błędy? Jakie jest Twoje pytanie? –
Tak, zgadza się. Chciałbym tylko uzyskać potwierdzenie tego. – Belloc
Masz rację. To musi być błąd w sposobie, w jaki klang wdrożył przyjaciół –