枚举类型值作为C++中数组的长度

Kev*_*ang 7 c++ arrays enums visual-studio constant-expression

众所周知,必须确定C++中的数组长度.然后我们可以使用:

const int MAX_Length=100;
Run Code Online (Sandbox Code Playgroud)

要么:

#define MAX_LENGTH 100
Run Code Online (Sandbox Code Playgroud)

在编译之前确定数组的长度.但是,当我读到lippman的书c ++入门时,在第5版的第3.5.1节中,它说:数组的长度必须是一个常量表达式.然后问题来了:

typedef enum Length{LEN1=100, LEN2, LEN3, LEN4}LEN; 
LEN MAX_Length=LEN2;  //101
int iArray[LEN2];     //attention
Run Code Online (Sandbox Code Playgroud)

代码在mingw32-g ++中成功编译.但在VS2008中失败了,错误是:

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'iArray' : unknown size
Run Code Online (Sandbox Code Playgroud)

我认为枚举值是常量,因此它应该用作数组的长度.对?

我很困惑,你能帮助我吗?谢谢.

Sha*_*our 7

在C++ 11和C++ 03中,枚举器(C++ 11中的无范围枚举)是整型常量表达式,因此可用于数组边界.我们可以通过转到草案C++ 11标准部分5.19 [expr.const]看到C++ 11的这个部分,它说:

整数常量表达式是整数或未整数枚举类型的表达式,隐式转换为prvalue,其中转换后的表达式是核心常量表达式.[注意:这些表达式可以用作数组边界(8.3.4,5.3.4),作为位字段长度(9.6),作为枚举器初始化器,如果底层类型不固定(7.2),作为空指针常量(4.10) )和作为比对(7.6.2). - 尾注]

或者C++ 03我们可以从草案C++ 03标准中看到这一点,或者我们可以得到最接近的1段相同的段落,其中说:

[...]一个整数常量表达式只能涉及算术类型的文字(2.13,3.9.1),枚举数,非易失性常量变量或用常量表达式(8.5)初始化的整数或枚举类型的静态数据成员,非整数或枚举类型的类型模板参数,以及sizeof表达式[...]

在rextester上,这个代码可以很好地编译 VC++,所以这不再是当前版本中的问题,这一定是2008年最终修复的错误.还在2015年12月3日更新的webcompiler上进行了测试,因此这也适用于最新版本之一.

一种替代方法可能是使用const int,例如:

const int len = LEN2 ;
Run Code Online (Sandbox Code Playgroud)

这将取决于Visual Studio 2008是否认为枚举器不是整数常量表达式,或者它是否只是在数组边界的上下文中,希望它只是后者.

C++ 98

据我可以告诉这也适用于C++ 98为好,两者gccclang用时允许此-std=c++98,没有草稿C++向公众提供98个标准,因此我可以证实超出.