我被困在C++ Primer中的一段代码中并且已经考虑了超过1小时.代码是
for (auto row : ia)//should use &row here
for (auto col : row)
Run Code Online (Sandbox Code Playgroud)
对它的解释是
我们这样做是为了避免正常的数组转换为指针.因为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;
}
}
Run Code Online (Sandbox Code Playgroud)
通常,基于范围的for循环声明为:
for ( decl : coll ) {
statement }
Run Code Online (Sandbox Code Playgroud)
如果coll提供begin()和end()成员,则等效于以下内容:
for (auto _pos=coll.begin(), _end=coll.end(); _pos!=_end; ++_pos )
{
decl = *_pos;
statement
}
Run Code Online (Sandbox Code Playgroud)
或者,如果不匹配,则使用全局begin()和end()将coll作为参数:
for (auto _pos=begin(coll), _end=end(coll); _pos!=_end; ++_pos )
{
decl = *_pos;
statement
}
Run Code Online (Sandbox Code Playgroud)
现在看看这一行decl = *_pos;,这里每次编译器初始化dec时,它会将每个数组元素(与数组类型的任何其他对象一样)转换为指向该数组的第一个元素的指针.
在你的情况下,raw的类型将出现在int*上,下一个for循环无法工作,因此它变得非法.