2011-12-03 22 views
18
class Settings 
{ 
private: 
    typedef std::map<std::string, SettingsOption> OptionMap; 

public: 
    typedef OptionMap::iterator iterator; 
    typedef OptionMap::const_iterator const_iterator; 

    ... 
}; 

Questo codice è portatile? Che cosa dice lo standard al riguardo?L'uso pubblico di typedef portable è pubblico?

risposta

24

È legale e Settings::iterator e Settings::const_iterator sono accessibili a tutti gli utenti della classe Settings.

Il controllo di accesso in C++ si applica esclusivamente ai nomi. C'è una nota e un esempio in ISO/IEC 14882: 2011 11 [class.access]/4 che chiarisce che questa è l'intenzione.

[...] [Nota: Perché il controllo di accesso si applica ai nomi, se il controllo di accesso è applicato ad un nome typedef, solo l'accessibilità del nome typedef stesso è considerato. L'accessibilità dell'entità a cui fa riferimento il typedef non è considerata. Ad esempio,

class A { 
    class B { }; 
public: 
    typedef B BB; 
}; 

void f() { 
    A::BB x; // OK, typedef name A::BB is public 
    A::B y; // access error, A::B is private 
} 

- fine nota]