这个C++转换为枚举有问题吗?

q09*_*987 4 c++ enums casting

给出以下代码:

enum Options
{
    Surf     = 0x01,
    Out      = 0x02
};

Options all = (Options) ( Surf | Out);
Run Code Online (Sandbox Code Playgroud)
  1. 这个铸件有问题吗?
  2. 如果这个演员有意义,为什么呢?

根据我的理解,Options只定义了两个变量.值0x03如何有意义?

Jam*_*lis 7

这个铸件有问题吗?

没有.

如果这个演员有意义,为什么呢?根据我的理解,Options只定义了两个变量,值0x03如何有意义?

枚举类型Options有两个命名的枚举器,但它表示的值范围足够大,可以用作包含每个枚举器的位域.

简而言之:是的,对于像这样的位域使用枚举是有效且定义良好的.

根据对此答案的评论的要求,允许这样的正式语言可以在C++标准(C++ 03 7.2/6)中找到:

对于枚举,其中e min是最小的枚举数且e max是最大的,枚举的值是b minb max范围内的基础类型的值,其中b minb max分别是最小的和最小位域的最大值,可以存储e mine max.

可以定义具有未由其任何枚举​​器定义的值的枚举.

关于这是否是好风格存在争议.当然可以说,通常认为枚举对象只能存储其枚举器之一,因此这样的代码可能会让人感到困惑和容易出错.

另一方面,我认为当枚举用作位域时通常很明显.通常这样的枚举用OptionsFlags后缀或类似的东西命名.同样,如果每个枚举器的设定值明显是单个设置位,则该枚举可能用作位域.