在C 11和C 03中,枚举器(C 11中的无范围枚举)是整数常量表达式,因此可用于数组边界.我们可以通过转到
draft C++11 standard部分5.19 [expr.const]看到C 11的这个,它说:
An integral constant expression is an expression of integral or
unscoped enumeration type, implicitly converted to a prvalue, where
the converted expression is a core constant expression. [ Note: Such
expressions may be used as array bounds (8.3.4, 5.3.4), as bit-field
lengths (9.6), as enumerator initializers if the underlying type is
not fixed (7.2), as null pointer constants (4.10), and as alignments
(7.6.2). —end note ]
和/或C 03我们可以从草案C 03标准或closest we can get同一段第1段看到这一点,其中说:
[…]An integral constant-expression can involve only literals of
arithmetic types (2.13, 3.9.1), enumerators, non-volatile const
variables or static data members of integral or enumeration types
initialized with constant expressions (8.5), non-type template
parameters of integral or enumeration types, and sizeof
expressions[…]
在rextester这个代码compiles fine for VC,所以这不再是当前版本中的问题,这一定是2008年最终修复的错误.还在2015年12月3日更新的webcompiler上进行了测试,因此这也适用于最新版本之一.
一种替代方法可能是使用const int,例如:
const int len = LEN2 ;
这将取决于Visual Studio 2008是否认为枚举器不是整数常量表达式,或者它是否只是在数组边界的上下文中,希望它只是后者.
C 98
据我所知,这也适用于C 98,当使用-std = c 98时,gcc和clang都允许这样做,没有公众可以使用的C 98标准草案,所以我可以确认.