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

时间:2016-01-24 20:14:42

标签: c++ arrays c++11

来自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无效。为什么会发生这种情况? “指向该数组的第一个元素的指针”,因为什么?

2 个答案:

答案 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)
            ;
}