La funzione amico f
non ha accesso ad un membro privato della classe che include A
.Credo che clang erroneamente permetta l'accesso ai dati in linea ai dati in un ambito che racchiude. Sia gcc che vs2013 rifiutano questo codice
#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();
}
Almeno, questo è quello che penso [class.nest]/4 in N4140 sta dicendo (vedi sotto).
§9.7/4
Come una funzione membro, una funzione amico (11.3) definita all'interno di una classe nidificata è nell'ambito lessicale di quella classe; obbedisce alle stesse regole per il binding del nome come funzione membro statico di tale classe (9.4), ma non ha diritti di accesso speciali per i membri di una classe allegata.
Potete per favore elaborare, vuol Clang lo permettono ma l'altro si dà errori? Qual è la tua domanda? –
Sì, è corretto. Vorrei solo avere qualche conferma su questo. – Belloc
Hai ragione. Questo deve essere un errore di come clang ha implementato gli amici –