7

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

const int MAX_Length=100;

或者:

#define MAX_LENGTH 100

在编译之前确定数组的长度。但是,当我阅读 lippman 的《c++ Primer》一书时,在第 5 版的第 3.5.1 章中,它说:数组的长度必须是一个常量表达式。那么问题来了:

typedef enum Length{LEN1=100, LEN2, LEN3, LEN4}LEN; 
LEN MAX_Length=LEN2;  //101
int iArray[LEN2];     //attention

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

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'iArray' : unknown size

而且我认为枚举值是恒定的,所以它应该用作数组的长度。正确的?

我很困惑,你能帮帮我吗?谢谢你。

4

1 回答 1

7

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

整型常量表达式是整型或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。[ 注意:此类表达式可用作数组边界 (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)初始化,非-type 整数或枚举类型的模板参数,以及 sizeof 表达式[...]

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

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

const int len = LEN2 ;

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

C++98

据我所知,这也适用于 C++98,gcc并且clang在使用时都允许这样做-std=c++98,没有可供公众使用的 C++98 标准草案,因此我可以确认除此之外。

于 2014-08-20T02:25:35.410 回答