Как получить доступ к безымянному «enum class», инкапсулированному внутри класса?

#c #class #enums #c 11

#c #класс #перечисления #c 11

Вопрос:

 class A {
  public: enum class { HELLO, WORLD };
};
  

Зная, что внутри class объявление простого enum (а не enum class ) является лучшей идеей, потому что оно уже введено с class идентификатором. Но все же приведенное выше утверждение является действительной C 0x подписью. Теперь как получить доступ к безымянному enum class внешнему?

 int i = A::HELLO; // error: ‘HELLO’ is not a member of ‘A’
  

Комментарии:

1. он просто не компилируется прямо из неназванного класса перечисления : D

Ответ №1:

На самом деле, это недопустимо. В C 0x FDIS указано (9.2p1)

За исключением случаев, когда используется для объявления друзей (11.3) или для введения имени члена базового класса в производный класс (7.3.3), объявления членов объявляют членов класса, и каждое такое объявление члена должно объявлять по крайней мере одно имя члена класса.

В вашем случае имя перечислителя не вводится в область видимости класса, и имя перечисления также не вводится. Таким образом, это объявление члена вообще не вводит имени члена.

РЕДАКТИРОВАТЬ: И на самом деле, существует более прямой запрет на объявление перечисления. 7.2p2:

Необязательный идентификатор не должен быть опущен при объявлении перечисления с ограниченной областью.

Комментарии:

1. это означает, что мы не можем инициализировать его объект в конструкторе. Таким образом, такой enum будет полностью отключен от внешнего мира, правильно?