Возможно ли вступление в класс enum?

Я знаю, что в С++ 11 можно переслать объявление типа перечисления (если предоставляется тип хранилища), например.

enum E : short;
void foo(E e);

....

enum E : short
{
    VALUE_1,
    VALUE_2,
    ....
}

Но я хотел бы переслать объявление перечисления, определенного в классе, например.

enum Foo::E : short;
void foo(E e);

....

class Foo
{
    enum E : short
    {
        VALUE_1,
        VALUE_2,
    ....
    }
}

Возможно ли подобное в С++ 11?

Ответы

Ответ 1

Нет, такое форвардное объявление невозможно. [decl.enum]/5 (смелый акцент мой):

Если за последним ключом перечисляется спецификатор вложенных имен, enum-specifier должен ссылаться на перечисление, которое было ранее объявляется непосредственно в классе или пространстве имен, к которому Вложенное имя-спецификатор ссылается (т.е. ни наследуется, ни вводится с помощью объявления-объявления), а спецификатор перечисления должен появиться в пространство имен, содержащее предыдущее объявление.

(В этом случае спецификатор вложенных имен будет именем вашего класса, за которым следует ::.)
Вы могли бы, однако, поместить перечисление на улицу и использовать декларацию непрозрачного enum.

Ответ 2

Как говорит @Columbo, вы не можете объявить его в указанной вами форме.

Вы можете, однако, переслать объявление вложенного перечисления внутри объявления класса:

class Foo
{
    enum E : short;
};

void foo(Foo::E e);

enum Foo::E : short
{
     VALUE_1,
     VALUE_2,
    ....
};

Получаете ли вы какую-либо выгоду, делая это, конечно, зависит от обстоятельств.