【问题标题】:Can I pass value of forward declared enum?我可以传递前向声明的枚举的值吗?
【发布时间】:2012-01-18 13:47:14
【问题描述】:

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

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

下一个示例使用 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) {} 是有效代码。见When to use forward declaration
  • 在定义E之前,您可以尝试define(而不是declarefoo
  • @LucTouraille 第一个链接说明了一切(谢谢)。对于第二件事,我知道我会得到 error: 'V1' is not a member of 'E' 错误的原因,但这会编译得很好:void foo( const E e ) { std::cout &lt;&lt; (int)e&lt;&lt;std::endl; } 如果你在定义枚举之前输入它。

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


【解决方案1】:

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

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

opaque-enum-declaration 要么是对枚举的重新声明 在当前范围内或新枚举的声明中。 [注意: opaque-enum-declaration 声明的枚举已修复 基础类型并且是完整类型。枚举器列表可以是 在稍后的重新声明中提供了枚举说明符。 ——尾注 ]

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

不透明枚举声明:

enum-key attribute-specifier-seqopt标识符 enum-baseopt;

【讨论】:

  • 这就是为什么 opaque-enums 总是有一个固定的底层类型(int 如果没有明确设置):因为这样它的大小是固定的,而不依赖于常量的值。
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 2023-03-27
  • 2013-02-14
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多