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

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

    ... 
}; 

此代码是否便携?标准对此有何描述?私有typedef公用是否便携?

回答

24

这是合法的,并且Settings::iteratorSettings::const_iterator可供Settings类的所有用户访问。

C++中的访问控制纯粹应用于名称。 ISO/IEC 14882:2011 11 [class.access]/4中有一个注释和例子,它清楚地表明这是意图。

[...] [注:由于访问控制应用到名字,如果访问控制是 应用于typedef名称,只有typedef名称本身的可访问性考虑。没有考虑typedef引用的实体的可访问性 。例如,

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 
} 

- 注完]