使用c ++ 11枚举类时,数组的大小具有非整数类型

bor*_*sbn 6 enums c++11

我用过这段代码:

enum E {
    E1, E2, E3, MaxNum
};

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};
Run Code Online (Sandbox Code Playgroud)

并没有问题.现在我想用"现代" enum class.代码现在看起来像这样:

enum class E {
    E1, E2, E3, MaxNum
};

const char * ENames[ E::MaxNum ] = {
    "E1", "E2", "E3"
};
Run Code Online (Sandbox Code Playgroud)

并得到一个错误

错误:数组'ENames'的大小具有非整数类型'E'

错误:'const char*[1]'的初始化程序太多

问:为什么enum class在c ++ 11中变成非整数,而通常的枚举是不可或缺的?

什么是问题的决定?如何声明一个大小的数组,这是枚举中的一个enum class

这里 - http://ideone.com/SNHTYe--就是一个简单的例子.

谢谢.

Jon*_*ely 7

问:为什么enum class在c ++ 11中变成非整数,而通常的枚举是不可或缺的?

因为它不是"通常的枚举",所以它的类型更强烈

如何声明一个大小的数组,这是枚举类中的枚举之一?

无论如何你还想要什么?您可以使用static_cast但问题的解决方案是"不要那样做".

如果你想要一个固定底层类型的枚举然后这样做,不要使用作用域枚举:

enum E : uint16_t {
    E1, E2, E3, MaxNum
};

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};
Run Code Online (Sandbox Code Playgroud)


Mic*_*urr 5

C++ 11 5.19/3"常量表达式"

整数表达式是积分或的常量表达式无作用域枚举类型.

范围枚举不是整数常量表达式.并且数组维度(如果指定)必须是"整数常量表达式,其值应大于零"(8.3.4/1"数组").

我怀疑这个的基本原理是作用域枚举不会隐式转换为int.

要解决此问题,您可以int按照user2523017的建议静态转换作用域枚举,或使用ccl 11枚举枚举名称的前C++ 11方法:

namespace E {
enum {
      E1, E2, E3, MaxNum
    };
}
Run Code Online (Sandbox Code Playgroud)

要么:

struct E {
enum {
      E1, E2, E3, MaxNum
    };
};
Run Code Online (Sandbox Code Playgroud)