绑定未知的数组

时间:2014-09-19 05:27:44

标签: c++ arrays

标准秒8.3 / 4说:

  

当声明符后跟时,也可以省略数组绑定   初始化器(8.5)。

没关系。以下编译正常:

int a[] = {1};

int main()
{
}

DEMO

但8.3 / 4也说

  

当几个“数组”规格相邻时,a   创建多维数组;只有第一个常数   可以省略指定数组边界的表达式。

以及

int a[][2];

int main()
{
}

无法编译

DEMO

但是如果我们在声明者之后添加一个初始化器:

int a[][1] = {{1}};

int main()
{
}

DEMO

工作正常。虽然标准没有指定多维数组的声明符必须跟一个初始化器。你能解释一下吗?

2 个答案:

答案 0 :(得分:5)

你的第一句话中的“也”是指较早的句子:

  

除了允许不完整对象类型的声明之外,在某些情况下,在函数参数声明(8.3.5)中可能会省略数组绑定。当声明符后跟初始化程序

时,数组绑定可能会被忽略

文本没有明确说明,但意图是数组绑定可能不会被省略,除了:(案例列表)

代码int a[][2];不是允许不完整对象类型的声明(例如int a[];也是非法的)。它不在函数参数的声明中;声明者也不是初始化者。

因此,此代码不属于任何列出允许省略数组绑定的情况。


早先的引用:

  

只有第一个指定数组边界的常量表达式可以省略

表示第一个之后的边界可能不会被省略。

答案 1 :(得分:0)

你说过

  

虽然标准没有指定声明者   多维数组必须遵循初始化程序。

这不是真的。多维数组是数组,因此您之前引用的关于省略数组边界的标准声明也适用于它们(带有附加的限制)。