为什么不是这个'for'循环有效?
考虑:
int ia[3][4]; for (auto row : ia) for (auto col : row)
第一个
for
通过iafor
迭代,其元素是大小为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) ; }