我可以传递前向声明的枚举值吗?

BЈо*_*вић 9 c++ enums forward-declaration c++11

传递声明的struct或类时,必须通过引用或指针将其传递给函数.

但是,使用前向声明的枚举可以做些什么?它是否也必须通过引用或指针传递?或者,它可以传递一个值吗?

下一个例子使用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);
}
Run Code Online (Sandbox Code Playgroud)

建立:

g++ gy.cpp -Wall -Wextra -pedantic -std=c++0x -O3
Run Code Online (Sandbox Code Playgroud)

以上标准是否合规,或者是否使用扩展名?

R. *_*des 11

声明的枚举,即使你没有指定枚举器(标准称为opaque-enum-declaration)是一个完整的类型,所以它可以在任何地方使用.

为完整起见,请参阅§7.2第3段的引用:

一个不透明枚举声明或者是一个在当前范围内的枚举的重声明或一个新的枚举的声明.[ 注意:通过声明的枚举不透明枚举声明具有固定的基础类型并且是一个完整类型.枚举器列表可以在稍后的重新声明中使用枚举说明符提供.- 尾注 ]

opaque-enum-declaration的语法,来自同一§7.2的第一段:

不透明枚举声明:

enum-key attribute-specifier-seq opt identifier enum-base opt;