有我的代码
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;
}
}