C++11 使用c+时,数组的大小为非整数类型+;11枚举类

C++11 使用c+时,数组的大小为非整数类型+;11枚举类,c++11,enums,C++11,Enums,我使用了以下代码: enum E { E1, E2, E3, MaxNum }; const char * ENames[ MaxNum ] = { "E1", "E2", "E3" }; 而且没有问题。 现在我想使用“modern”enum类。代码现在如下所示: enum class E { E1, E2, E3, MaxNum }; const char * ENames[ E::MaxNum ] =

我使用了以下代码:

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

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};
而且没有问题。 现在我想使用“modern”
enum类
。代码现在如下所示:

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

const char * ENames[ E::MaxNum ] = {
    "E1", "E2", "E3"
};
我犯了一个错误

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

错误:“常量字符*[1]”的初始值设定项太多

问:为什么
enum类在c++11中变为非整数,而通常的enum是整数

什么是问题的决定?如何声明大小为的数组,即
enum类中的枚举之一

这里是一个简单的例子

谢谢。

C++11 5.19/3“常量表达式”

整型常量表达式是整型或无范围的枚举类型的文字常量表达式

作用域枚举不是整型常量表达式。数组维数(如有规定)必须是“整型常量表达式,其值应大于零”(8.3.4/1“数组”)

我怀疑这样做的理由是作用域枚举不会隐式转换为
int

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

namespace E {
enum {
      E1, E2, E3, MaxNum
    };
}
或:

问:为什么
enum类在c++11中变为非整数,而通常的enum是整数

因为它不是“普通枚举”,所以它的类型更强

如何声明具有大小的数组,即枚举类中的枚举之一

你为什么要这么做?您可以使用
static\u cast
,但问题的解决方案是“不要这样做”

如果需要固定基础类型的枚举,请执行此操作,不要使用作用域枚举:

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

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};

您可以将其强制转换为底层类型
const char*ENames[static_cast(E::MaxNum)]={“E1”、“E2”、“E3”}@user2523017谢谢。我不知道
基本的\u类型
。我想,你应该把它作为一个答案。我不理解你的“为什么”问题:枚举类的全部要点当然是它们是一种不可隐式转换的独特类型。现在,这是否真的可行是一个完全不同的问题。IMHO C++11枚举类是非常无用的。@KonradRudolph你是对的,但这是我第一次看
enum类
,我不知道(直到现在)关于与它们之间的隐式/显式转换的所有详细信息我没有给出答案,因为它只解决了您问题的一部分,而且我不熟悉作用域和强类型枚举背后的完整设计原理。不过,在你的答案中可以随意使用它!感谢标准的引用、关于隐式转换的解释以及尝试解决问题,但我不想使用C++11之前的方法,因为我想为我的枚举指定一个类型:
enum class E:uint16\u t
forexample@borisbn,您不需要使用作用域枚举来拥有固定的基础类型,只需编写
enum E:uint16_t
+1从未意识到可以指定基础类型,并且
enum
保持不受范围限制。每天(正确地说-小时)我都在学习新的东西。。。我认为,指定基础类型只能用于作用域枚举(也称为枚举类)。多谢各位/我去学习有关枚举的标准)
enum E : uint16_t {
    E1, E2, E3, MaxNum
};

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};