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



有我的代码

int array[3][4] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (auto line : array)
// something

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

我已经寻找了关于循环基于范围的参考,我使用的是C++11,所以相应的源代码是

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

根据解释的第一项:

如果range_expression是数组类型的表达式,则begin_expr是__range

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

为什么?有人能帮我吗?

在您的示例中,__begin的类型为int(*)[4]

range_declaration__begin的取消引用值,因此在您的示例中,range_declaration的类型为int*

在您的示例中,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;
}
}

最新更新