当我们使用数组时,它会自动转换为指向它的指针 第一要素。 (c ++ primer 5th ed.pp129)
int ia[3][4];
for (auto p = ia; p!= ia + 3; ++pp){
for (auto q = *p; q ! = *p + 4; ++q)
cout << *q << ' ';
cout << endl;
}
上面的代码片段是报价的一个很好的例子。 p
是一个指针指向一个包含四个整数的数组,q
是一个指针指向int
然而,基于范围的循环具有不同的故事
for (auto row: ia) // the code won't compile in fact
for (auto col: row)
这里,row
的类型是指针指向int (因为第二个循环不会编译)。这是为什么?这不是使用数组的情况吗?
答案 0 :(得分:3)
&#34;使用数组&#34;是一个非常粗糙的表达。
要了解数组的使用方式,首先必须了解基于for循环的范围。让我们扩展你的外部循环以使用等效的常规for循环(我已经简化了一点):
{
for (auto __begin = std::begin(ia), __end = std::end(ia);
__begin != __end; ++__begin) {
auto row = *__begin;
for (auto col: row); // oops. Cannot use range-for with a pointer
}
}
这里的问题是,推导出的auto row
类型是什么?
*__begin
的结果是&#34; 4个整数和#34;的数组的l值。 auto
遵循模板参数推导的规则。参数不能是数组对象,因此auto
永远不能推断为数组。数组类型衰减到指向第一个元素的指针,即在这种情况下指向int
的指针。
一个参数可以推断为&#34;引用4个整数的数组&#34;,所以这将起作用:
for (auto& row: ia)
for (auto col: row)
答案 1 :(得分:2)
此处的问题是for (auto row: ia)
导致ia
的元素衰减为指针,因此row
成为指针类型。这意味着您无法使用for (auto col: row)
,因为没有为指针定义开始函数。
您需要做的是参考,以便您参考1d数组而没有指向它的指针。看起来像是
for (auto& row: ia) // reference to each row in the array
for (auto col: row) // copy of each element in the row