Могу ли я передать значение форвард объявленного enum? - PullRequest
9 голосов
/ 18 января 2012

При передаче объявленной структуры или класса вперед необходимо передать его функции через ссылку или указатель.

Но что можно сделать с объявленным форвардом enum? Это также должно быть передано через ссылку или указатель? Или это может быть передано со значением?

Следующий пример прекрасно компилируется с использованием g ++ 4.6.1:

#include <iostream>

enum class E;

void foo( const E e );


enum class E
{
  V1,
  V2
};

void foo( const E e )
{
  switch ( e )
  {
    case E::V1 :
      std::cout << "V1"<<std::endl;
      break;
    case E::V2 :
      std::cout << "V2"<<std::endl;
      break;
    default:
      ;
  }
}

int main()
{
  foo( E::V1);
  foo( E::V2);
}

Для постройки:

g++ gy.cpp -Wall -Wextra -pedantic -std=c++0x -O3

Соответствует ли вышеуказанный стандарт стандарту или используется расширение?

1 Ответ

11 голосов
/ 18 января 2012

Объявленное перечисление, даже если вы не указываете перечислители (то, что стандарт называет opaque-enum-объявление ), является полным типом, поэтому его можно использовать везде.

Для полноты вот цитата из пункта 3 §7.2:

непрозрачное-перечисление-объявление - это либо переопределение перечисления в текущем объеме или объявлении нового перечисления. [ Примечание: An перечисление, объявленное непрозрачным объявлением-перечислением , исправлено базовый тип и является полным типом. Список счетчиков может быть предоставляется в последующем переопределении с указателем перечисления. —конечная записка ]

И грамматика для opaque-enum-декларации , из первого абзаца того же §7.2:

непрозрачное перечисление-декларация:

enum-ключ атрибут-спецификатор-seq opt идентификатор enum-base opt ;

...