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

9

当传递前向声明的结构体或类时,必须通过引用或指针将其传递给函数。

但是,前向声明的枚举应该如何处理?它也必须通过引用或指针传递吗?还是可以通过值传递?

下面的示例在使用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

上述内容是否符合标准,还是使用了扩展功能?

你的代码同样可以使用前向声明的类来实现:struct A; void foo(A); struct A {}; void foo(A) {} 这是有效的代码。请参阅何时使用前向声明 - Luc Touraille
你可以尝试的是在定义E之前定义(而不是声明foo - Luc Touraille
@LucTouraille 第一个链接已经说明了一切(谢谢)。对于第二个问题,我知道如果在定义枚举之前放置以下代码,则会出现“error:'V1'不是'E'的成员”的错误,但这将编译成功:void foo(const E e) {std :: cout <<(int)e << std :: endl;} - BЈовић
1个回答

11

即使您不指定枚举器(标准称为opaque-enum-declaration),已声明的枚举也是一个完整的类型,因此它可以在任何地方使用。

为了完整起见,这里是§7.2第3段的一句话:

  

opaque-enum-declaration是当前范围中枚举的重新声明或新枚举的声明。 [注意: opaque-enum-declaration声明的枚举具有固定底层类型并且是完整的类型。枚举器列表可以在稍后的重声明中使用enum-specifier提供。 —end note ]

同一§7.2的第一段中opaque-enum-declaration的语法:

  

opaque-enum-declaration:

     
    

enum-key attribute-specifier-seqopt identifier enum-baseopt;

  

1
这就是为什么不透明枚举始终具有固定的底层类型(如果没有明确设置,则为“int”)的原因:因为这样它的大小是固定的,不依赖于常量的值。 - rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接