У меня есть следующий код:
class Base
{
private:
class NestedBase
{
public:
void Do() {}
};
public:
NestedBase nested;
};
int main()
{
Base b;
b.nested.Do(); // line A compiles
Base::NestedBase instance; // line B doesn't compile
}
NestedBase
класс является частным вложенным классом Base
, поэтому кажется естественным, что строка B не компилируется. Но, с другой стороны, переменная b
имеет публичного члена nested
и я могу вызвать его метод Do()
снаружи Base
(как в строке A). Каковы точные правила, регулирующие доступ к частному вложенному классу (или его членам) в таком случае? Что стандарт говорит об этом?
Согласно стандарту, $ 11,7 / 1 Вложенные классы [class.access.nest]:
Вложенный класс является членом, и поэтому имеет те же права доступа, что и любой другой член.
Итак, все довольно просто. NestedBase
это private
член класса Base
, так Base::NestedBase
не могут быть доступны в main()
,
b.nested.Do();
хорошо, потому что nested
а также Do()
оба public
члены. Дело в том, что NestedBase
это private
вложенный класс Base
не имеет значения, это не имеет значения здесь.
Введите имя NestedBase
является частным членом класса.
class Base
{
private:
class NestedBase
{
public:
void Do() {}
};
//...
Таким образом, вы не можете явно получить к нему доступ вне класса, в котором объявлено имя.
Но вы можете получить доступ к имени неявным образом следующим образом 🙂
decltype( Base::nested) instance;