为什么基于范围的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_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;
}
}
有我的代码
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_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;
}
}