2015-07-19 5 views
14

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.

live example

+0

Potete per favore elaborare, vuol Clang lo permettono ma l'altro si dà errori? Qual è la tua domanda? –

+0

Sì, è corretto. Vorrei solo avere qualche conferma su questo. – Belloc

+0

Hai ragione. Questo deve essere un errore di come clang ha implementato gli amici –

risposta

4

credo che lei ha ragione, in quanto entrambi Visual Studio e GCC rifiuta il codice correttamente in base alla spec hai citato. Clang sembra essere in errore consentendo l'accesso alla variabile membro privato Ap dalla funzione amico f(), perché f() è un amico di B, non A.

Per una buona discussione del campo di applicazione funzioni friend, vedere la risposta top-votato nel seguente SO postale: What's the scope of inline friend functions