0

在下面的代码中为什么这两个语句是非法的

const int i[] = { 1, 2, 3, 4 };

// float f[i[3]]; // Illegal

struct S { int i, j; };
const S s[] = { { 1, 2 }, { 3, 4 } };
//double d[s[1].j]; // Illegal
int main() {} 

为什么它们是非法的?文字定义如下,我不明白。

“在数组定义中,编译器必须能够生成移动堆栈指针以容纳数组的代码。在上述两种非法定义中,编译器都会抱怨,因为它无法在数组定义中找到常量表达式。”

提前致谢。

4

3 回答 3

6

数组大小需要是常量表达式。尝试这个:

constexpr int i[] = { 1, 2, 3, 4 };

float f[i[3]];

constexpr关键字是在 C++11 中引入的。以前的 C++ 版本没有这种通用常量表达式的概念,也没有等效的概念。

于 2012-08-21T14:20:29.183 回答
2

因为 C++ 不支持变长数组,s[1].j也不是编译时常量。

f该引用所指的是和d自动存储中的事实。当它们超出范围时,运行时将自动清理它们的内存。因此,它必须事先知道大小。

于 2012-08-21T14:19:28.260 回答
0

因为 d 是静态数组,这意味着它的大小必须在编译时知道。因此,您不能使用非常量变量作为大小参数。

但是你可以试试

 const int i = 3;
 double d[i];

例如。

于 2012-08-21T14:22:34.393 回答