为什么不是这个'for'循环有效?

考虑:

int ia[3][4]; for (auto row : ia) for (auto col : row) 

第一个for通过ia for迭代,其元素是大小为4的数组。 因为row不是引用,所以当编译器初始化row它会将每个数组元素(就像其他数组types的对象一样)转换为指向该数组的第一个元素的指针。 因此,在这个循环中, row的types是int*

我不是很确定,我明白这个汽车是如何工作的,但是如果我可以假设它会自动给出一个基于ia数组成员types的行,但是我不明白为什么这种行为不行参考,是无效的。 为什么会发生这种情况? “指向该数组的第一个元素的指针” ,是因为什么?

问题在于, row是一个int *而不是一个int[4] ,因为数组会衰减到指针,并且没有自动的方法来知道指针指向了多less个元素。

为了解决这个问题std::array已经被添加到一切工作如预期:

 #include <array> int main() { std::array<std::array<int, 4>, 3> ia; for (auto &row : ia){ for (auto &col : row){ col = 0; } } } 

注意& row前和col表示你想要一个引用,而不是行和列的副本,否则设置col为0对ia没有任何影响。

为了防止int[]int*的衰减,可以使用&&

 int main() { int ia[3][4]; for (auto && row : ia) for (auto && col : row) ; }