在下面的代码中,为什么这两个语句是非法的
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() {}
为什么他们是非法的?文字定义如下,我不明白。
“在数组定义中,编译器必须能够生成代码 移动堆栈指针以容纳数组。在两个 上面的非法定义,编译器抱怨因为它不能 在数组定义中找到一个常量表达式。“
提前致谢。
答案 0 :(得分:6)
数组大小需要是常量表达式。试试这个:
constexpr int i[] = { 1, 2, 3, 4 };
float f[i[3]];
{+ 1}}关键字是在C ++ 11中引入的。以前版本的C ++没有这种通用常量表达式的概念,也没有相应的概念。
答案 1 :(得分:2)
因为C ++不支持可变长度数组,s[1].j
不是编译时常量。
引用的内容是f
和d
位于自动存储空间中。运行时将在超出范围时自动清理内存。因此,它必须事先知道大小。
答案 2 :(得分:0)
因为d是静态数组,这意味着必须在编译时知道它的大小。 因此,您不能将非const变量用作大小参数。
但你可以试试
const int i = 3;
double d[i];
例如。