用c ++聚合

时间:2012-08-21 14:18:19

标签: c++

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

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() {} 

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

  

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

提前致谢。

3 个答案:

答案 0 :(得分:6)

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

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

float f[i[3]];

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

答案 1 :(得分:2)

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

引用的内容是fd位于自动存储空间中。运行时将在超出范围时自动清理内存。因此,它必须事先知道大小。

答案 2 :(得分:0)

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

但你可以试试

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

例如。