Является ли публичное использование частного typedef переносимым? - PullRequest
18 голосов
/ 03 декабря 2011
class Settings
{
private:
    typedef std::map<std::string, SettingsOption> OptionMap;

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

    ...
};

Является ли этот код переносимым?Что стандарт говорит об этом?

1 Ответ

25 голосов
/ 03 декабря 2011

Это допустимо, и Settings::iterator и Settings::const_iterator доступны всем пользователям класса Settings.

Контроль доступа в C ++ применяется исключительно к именам.В ИСО / МЭК 14882: 2011 11 есть примечание и пример 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
}

- конечная нота ]

...