C ++:自动变量推导不同于循环的范围与多维数组的循环的法线不同

时间:2017-09-06 22:53:44

标签: c++ c++11

以下是:

int ia [3][4] =  {
                        {0, 1, 2, 3},
                        {4, 5, 6, 7},
                        {8, 9, 10, 11}
                     };
  1. 正常作业:

    auto p = ia;
    

    这是可以理解的 数组 ia 返回指向其第一个元素的指针,该元素是4个元素的第1行(4个元素的批次)。
    p有int(*)[4]。执行p + 1将指向下一批4个元素。

  2. 使用范围:

    for (auto row : ia) {
            for (auto col: row)
                    cout << col << " ";
            cout << endl;
    }
    

    为什么不是int(*)[4]因为每个循环都返回4个元素的批次,就像上一个例子一样?
    相反,它是int *。
    当我将鼠标悬停在变量上时,它会给我int * ..

  3. 由于

1 个答案:

答案 0 :(得分:4)

基于范围的for循环获取每个数组元素,并在每个循环回合中从给定初始化程序派生的声明或表达式中使用它。数组元素的类型为int[4],因此对于代表当前范围元素的发明变量int __elem[4],您的循环体有效地说:

const auto row = __elem;   // __elem is int[4]

现在看起来应该很熟悉:右边的数组表达式衰减为指向其第一个元素的指针,因此键入int

如果您想避免衰减,则需要绑定引用

const auto& row = __elem;    // row is int(&)[4]

将其重新放回基于范围的循环中,您需要:

for (const auto& row : ia) {
    for (const int& cell : row) {
        // ...
    }
}