C++ 当我在cpp中的初始化中指定多维数组时,为什么多维数组必须有边界

C++ 当我在cpp中的初始化中指定多维数组时,为什么多维数组必须有边界,c++,arrays,C++,Arrays,尝试初始化多维数组时,如下所示: int a[][] = { {1,2,3}, {4,5,6} }; 我得到这个错误: error: declaration of iArray as multidimensional array must have bounds for all dimensions except the first 但是我想理解为什么,编译器应该知道它是一个[2][3]数组,因为{} 我知道这也是允许的: int a[][3] = {1,2,3,

尝试初始化多维数组时,如下所示:

int a[][] = { {1,2,3},
              {4,5,6} };
我得到这个错误:

error: declaration of iArray as multidimensional array must have bounds for all dimensions except the first
但是我想理解为什么,编译器应该知道它是一个[2][3]数组,因为{}

我知道这也是允许的:

int a[][3] = {1,2,3,4,5,6};

在这种情况下,如果第二维度缺失,编译器确实猜不出它是什么,但是为什么不允许在第一种情况下使用[][]呢?

[Shrug]就是这样

您可以建议更改标准以允许这样做。您需要:

  • 写一份说明书
  • 解释为什么这值得增加额外的复杂性(标准和实现)
  • 可能会修改现有实现以将其添加为扩展

我并不清楚这会有很多问题,但另一方面,也不清楚这会有多大好处(在每个人的心目中,为原始数组添加额外的支持可能都很低)。

C++数组是从第3、第6行开始的连续的单元格、行块(在本例中)。如果没有大小声明,则无法执行此操作

标准/编译器的创建者希望根据声明检查初始值设定项,而不是从多个初始值设定项中猜测,可能有些初始值设定项有拼写错误。 我认为,猜测3,4维以上的尺寸和可变的初始化长度太难了?编辑:同意molbdnilo注释,编译器简化

如果您接受过Java/C#(或像std::vector这样的高级对象实现)方面的培训,那么您必须考虑C风格


编辑:在两个选项中明确声明或通过初始化声明的一维数组是非常简单的C线性结构(即,可以在负索引或超出索引大小时访问)。要说实话,编译后的代码不依赖于大小,这方面的知识是没有用的

当初始化这样的数组时,
inta[5]={1,2,3}允许您在最后忽略值。这是我能想象的唯一原因。然而,
inta[]={1,2,3}是允许的。所以也许没有技术上的原因,但就是这样,因为就是这样,我感觉“为什么”很久以前就消失在丹尼斯·里奇的胡子里了。可能是因为这是函数参数的有效语法,并且在任何地方应用相同的规则都可以简化编译器。OP并不是要求编译器猜测维度或不指定维度,而是在
{1,2,3},{4,5,6}中已经给出了维度,那么为什么它们必须重复?您不必为每行指定完整的元素数(省略的元素被初始化为值,在本例中为零),因此规则必须至少是从提供的最长行中获取行宽,但这使得声明很难阅读,除非它们被很好地格式化为对齐。@无用-如果有99行长度相等,而有一行长度不同,我宁愿有一个错误-无论是长还是短。:-)