C++ C++;11多维数组上循环的范围

C++ C++;11多维数组上循环的范围,c++,c++11,C++,C++11,我正在从C(ANSI)跳到C++11。这的确是一个奇怪的世界 我正在努力解决以下问题: int tbl[NUM_ROWS][NUM_COLS] = { 0 }; for (auto row : tbl) for (auto col : row) // ERROR - can't iterate over col (type int *) // do stuff 我猜,这里的有理数相当于(在C中)之间的差异: 但是,我不太明白以下是如何工作的: int tbl[NUM_ROWS][N

我正在从C(ANSI)跳到C++11。这的确是一个奇怪的世界

我正在努力解决以下问题:

int tbl[NUM_ROWS][NUM_COLS] = { 0 };
for (auto row : tbl)
  for (auto col : row) // ERROR - can't iterate over col (type int *)
    // do stuff
我猜,这里的有理数相当于(在C中)之间的差异:

但是,我不太明白以下是如何工作的:

int tbl[NUM_ROWS][NUM_COLS] = { 0 };
for (auto &row : tbl) // note the reference
  for (auto col : row)
    // do stuff
从逻辑上讲,我认为
auto
被键入
int*const
——这就是“array”变量,指向(可能)非常量元素的常量指针。但这怎么比普通指针更具可迭代性呢?或者,因为<代码>行<代码>是引用,实际上它是键入了代码> int [NUMKOLS] ,就像我们声明的“代码>行< /COD>作为<代码> int行[NUMKOLS]

< P> C++中没有“多维数组”。只有数组。但是,数组的元素类型本身可以是数组

当您说(自动x:y)的
时,则
x
是范围元素的副本。但是,不能复制数组,因此当
y
是数组值数组时,这是无效的。相比之下,形成对数组的引用是非常好的,这就是为什么
for(auto&x:y)
工作的原因

也许这有助于说明以下类型:

int a[10][5];  // a is an array of 10 elements of int[5]

for (int (&row)[5] : a)
    for (int & cell : row)
        cell *= 2;
< C++中没有“多维数组”。只有数组。但是,数组的元素类型本身可以是数组

当您说(自动x:y)
时,则
x
是范围元素的副本。但是,不能复制数组,因此当
y
是数组值数组时,这是无效的。相比之下,形成对数组的引用是非常好的,这就是为什么
for(auto&x:y)
工作的原因

也许这有助于说明以下类型:

int a[10][5];  // a is an array of 10 elements of int[5]

for (int (&row)[5] : a)
    for (int & cell : row)
        cell *= 2;

是的,我知道没有多维数组-这比说数组的数组更容易…无论如何,你是对的,数组不能被复制-赋值的尝试只是复制第一个元素的地址。好的,这是一个基本的区别,说明引用不仅仅是一个常量指针(即使它们是在内部实现的);数组的引用的作用类似于数组,而不仅仅是指向数组的指针的引用element@user70869:数组不是指针。数组是数组。(它们肯定不是“常量指针”。你可能会想到prvalues。)是的,数组肯定不是指针。我是说引用不仅仅像常量指针(顶级常量)。是的,我知道没有多维数组-这比说数组的数组更容易…总之,你是对的,数组不能被复制-赋值的尝试只是复制第一个元素的地址。好的,这是一个基本的区别,说明引用不仅仅是一个常量指针(即使它们是在内部实现的);数组的引用的作用类似于数组,而不仅仅是指向数组的指针的引用element@user70869:数组不是指针。数组是数组。(它们肯定不是“常量指针”。你可能会想到prvalues。)是的,数组肯定不是指针。我是说引用不仅仅像常量指针(顶级常量)。