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

时间:2012-01-18 13:47:14

标签: c++ enums c++11 forward-declaration

当传递声明的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);
}

构建:

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

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

1 个答案:

答案 0 :(得分:11)

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

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

  

opaque-enum-declaration 是枚举的重新声明   在当前范围或新枚举的声明中。 [注意: An   由 opaque-enum-declaration 声明的枚举已修复   底层类型,是一个完整的类型。枚举器列表可以是   在稍后的重新声明中提供了enum-specifier。 -end note ]

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

  

opaque-enum-declaration:

     
    

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