为什么基于范围的for循环中二维数组的元素是T*而不是T(*)[n]?

Why the element of a Two-dimensional array in range based for loop is T* instead of T (*)[n]?

有我的代码

int array[3][4] = {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

for (auto line : array)
  // something

为什么line的类型是int *而不是int (*)[4]

我找过reference关于基于范围的for循环,我用的是C++11,所以对应的源码是

{
  auto && __range = range_expression ;
  for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {
    range_declaration = *__begin;
  loop_statement
}

根据解释的第一项:

If range_expression is an expression of array type, then begin_expr is __range

所以有一个语句__begin = range_expression,它等于auto line = array
然后line的类型是int (*)[4],但实际上是int *?

为什么?有人可以帮助我吗?

在你的例子中 __begin 是类型 int(*)[4]

range_declaration__begin 的取消引用值,因此在您的示例中 range_declarationint*.

类型

在您的示例中,line 变量 range_declaration

如果我们删除语法糖,您的代码将如下所示:

int array[3][4] = {{1, 2, 3, 0}, {4, 5, 6, 0}, {7, 8, 9, 0}};
{
  int (&__range)[3][4] = array;
  int (*__begin)[4] = __range;
  int (*__end)[4] = __range + 3L;
  for(; __begin != __end; ++__begin) {
    int * line = *__begin;
  }
}