在switch case中混合枚举类和unsigned int的C++ 11将无法编译

pau*_*ulm 7 c++ c++11 enum-class

为什么这段代码不能编译,我该怎么做才能编译?

#include <iostream>
using namespace std;

enum class myEnum : unsigned int
{
    bar = 3
};

int main() {
    // your code goes here

    unsigned int v  = 2;
    switch(v)
    {
        case 2:
        break;

        case myEnum::bar:
        break;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

ideone:

https://ideone.com/jTnVGq

prog.cpp: In function 'int main()':
prog.cpp:18:16: error: could not convert 'bar' from 'myEnum' to 'unsigned int'
   case myEnum::bar:
Run Code Online (Sandbox Code Playgroud)

未能在GCC和Clang中建立,在MSVC 2013中有效.

use*_*717 12

这样做的全部目的enum class是使其成员无法直接与ints 进行比较,表面上提高了C++ 11相对于C++ 03的类型安全性.class从中删除enum class,这将编译.

引用Bjarne勋爵:

(An)enum class(范围枚举)是enum枚举数在枚举范围内的位置,并且不提供对其他类型的隐式转换.

  • 我敢说你夸大了"整个目的".使用`enum class`的另一个原因是将枚举器限制为嵌套的命名空间. (4认同)

Jam*_*wuh 5

您可以简单地使用这样的语法:

enum class Test { foo = 1, bar = 2 };
int main()
{
  int k = 1;
  switch (static_cast<Test>(k)) {
    case Test::foo: /*action here*/ break;
  }
}
Run Code Online (Sandbox Code Playgroud)