我被困在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"的形式?它应该是指向其第一个元素的地址而不是"具体"数组的指针吗?那么内循环有什么不对?我认为它应该是与外循环相同的机制..我无法理解Q&A上的帖子.请有人赐教......我的理解有什么不对......也欢迎一个好的链接!提前谢谢了!
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; } }
SACHIN GOYAL.. 5
通常,基于范围的for循环声明为:
for ( decl : coll ) { statement }
如果coll提供begin()和end()成员,则等效于以下内容:
for (auto _pos=coll.begin(), _end=coll.end(); _pos!=_end; ++_pos ) { decl = *_pos; statement }
或者,如果不匹配,则使用全局begin()和end()将coll作为参数:
for (auto _pos=begin(coll), _end=end(coll); _pos!=_end; ++_pos ) { decl = *_pos; statement }
现在看看这一行decl = *_pos;
,这里每次编译器初始化dec时,它会将每个数组元素(与数组类型的任何其他对象一样)转换为指向该数组的第一个元素的指针.
在你的情况下,raw的类型将出现在int*上,下一个for循环无法工作,因此它变得非法.
通常,基于范围的for循环声明为:
for ( decl : coll ) { statement }
如果coll提供begin()和end()成员,则等效于以下内容:
for (auto _pos=coll.begin(), _end=coll.end(); _pos!=_end; ++_pos ) { decl = *_pos; statement }
或者,如果不匹配,则使用全局begin()和end()将coll作为参数:
for (auto _pos=begin(coll), _end=end(coll); _pos!=_end; ++_pos ) { decl = *_pos; statement }
现在看看这一行decl = *_pos;
,这里每次编译器初始化dec时,它会将每个数组元素(与数组类型的任何其他对象一样)转换为指向该数组的第一个元素的指针.
在你的情况下,raw的类型将出现在int*上,下一个for循环无法工作,因此它变得非法.