来自Lippman的C ++ Primer第5版,第182页,考虑:
int ia[3][4];
for (auto row : ia)
for (auto col : row)
第一个
for
遍历ia,其元素是大小为4的数组。 因为row
不是引用,当编译器初始化row
时,它将转换每个数组元素(就像数组的任何其他对象一样) type)指向该数组的第一个元素的指针。结果就是这个 循环row
的类型为int*
。
我不确定我是否理解这个自动如何工作,但是如果我可以假设它自动给出基于ia
数组成员类型的行的类型,但我不明白为什么这种类型其中row不是引用的for
无效。为什么会发生这种情况? “指向该数组的第一个元素的指针”,因为什么?
答案 0 :(得分:73)
问题是row
是一个int *
而不是int[4]
,因为数组衰减到指针并且没有自动方式知道指针指向多少元素到。
为了解决这个问题,我已经添加了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
没有影响。
答案 1 :(得分:38)
为防止int[]
到int*
的衰减,您可以使用&&
int main() {
int ia[3][4];
for (auto && row : ia)
for (auto && col : row)
;
}