私有类型定义的公共用法是可移植的

Is public usage of private typedef portable?

本文关键字:用法 可移植 类型 定义      更新时间:2023-10-16
class Settings
{
private:
    typedef std::map<std::string, SettingsOption> OptionMap;
public:
    typedef OptionMap::iterator iterator;
    typedef OptionMap::const_iterator const_iterator;
    ...
};

这个代码可移植吗?标准是怎么说的?

这是合法的,Settings::iteratorSettings::const_iterator可以被Settings类的所有用户访问。

c++中的访问控制仅应用于名称。在ISO/IEC 14882:2011 11[类]中有注释和示例。Access]/4,明确表示这是意图。

[…[注意:因为访问控制适用于名称,如果访问控制是应用于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
}

- 结束说明]