我被困在C ++ Primer中的一段代码中,并且考虑了超过1个小时。该代码是
for (auto row : ia)//should use &row here
for (auto col : row)
对此的解释是
我们这样做是为了避免普通数组到指针的转换。因为row不是引用,所以当编译器初始化row时,它将把每个数组元素(像其他任何数组类型的对象一样)转换为指向该数组第一个元素的指针。结果,在此循环中,行的类型为int *。内部for循环是非法的。尽管有我们的意图,但是该循环尝试对int *进行迭代。
我知道每次都与迭代有关for(auto col:row)
。我不明白的
我们这样做是为了避免将普通数组转换为指针”
我们为外循环传递的“ ia”是什么形式?它应该是指向其第一个元素的地址的指针,而不是指向“具体”数组的指针吗?那么内循环怎么了?我认为应该与外部循环使用相同的机制。.我不明白问答环节。请有人启发我...我的理解有什么问题...也欢迎一个良好的链接!提前谢谢了!
ia的声明是
constexpr size_t rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt]; // 12 uninitialized elements
// for each row
for (size_t i = 0; i != rowCnt; ++i) {
// for each column within the row
for (size_t j = 0; j != colCnt; ++j) {
// assign the element's positional index as its value
ia[i][j] = i * colCnt + j;
}
}
通常,基于范围的for循环声明为:
for ( decl : coll ) {
statement }
如果coll提供begin()和end()成员,则等效于以下内容:
for (auto _pos=coll.begin(), _end=coll.end(); _pos!=_end; ++_pos )
{
decl = *_pos;
statement
}
或者,如果不匹配,则使用以coll作为参数的全局begin()和end()进行以下操作:
for (auto _pos=begin(coll), _end=end(coll); _pos!=_end; ++_pos )
{
decl = *_pos;
statement
}
现在看一行decl = *_pos;
,在这里每次编译器将初始化dec时,它将把每个数组元素(像数组类型的任何其他对象一样)转换为指向该数组第一个元素的指针。
在您的情况下,raw的类型将显示为int *,在该类型上next for循环无法工作,因此它变为非法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句