私有typedef的公共使用是否可移植?

时间:2011-12-03 08:48:20

标签: c++ typedef

class Settings
{
private:
    typedef std::map<std::string, SettingsOption> OptionMap;

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

    ...
};

此代码是否可移植?标准的含义是什么?

1 个答案:

答案 0 :(得分:25)

它是合法的,Settings::iterator类的所有用户都可以访问Settings::const_iteratorSettings

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
}
  

- 结束记录]