为什么二维数组中的Range是这样写的

Why the Range for in a two-dimensional Array is written in this way?

本文关键字:Range 二维数组 为什么      更新时间:2023-10-16

这是github.com/pezy/CppPrimer.上的一个小程序

int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
// a range for to manage the iteration
for (const int(&p)[4] : ia)
    for (int q : p) cout << q << " ";
cout << endl;

只是想知道为什么在的范围中使用const int(&p)[4]。

我本来打算使用for(int p[4] : ia),因为我认为这样p就会变成int[4],所以无论是通过值还是通过引用,当q访问p中的每个元素时,它都会在下一行中工作。但当我尝试for(int p[4] : ia)时,编译器说不能使用int*初始化int[]。我只是不知道为什么。

更进一步,我知道这个代码不会工作:

int i = 10;
int *c= &i;
int &p = c;

引用不能由指针初始化,但根据编译器给出的错误,似乎正是这种情况。

在循环机制的范围内(此处描述),会发生类似的情况:

int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
// begin is deduced to be an int (*)[4]
auto begin = ia, end = ia + 12;
// Hence *begin is an int (&)[4]
int p[4] = *begin;

但是,无法从另一个数组复制初始化数组,因此代码无法编译。

您得到的错误消息是因为编译器试图将*begin(对行的引用)衰减为指向该行第一个元素的指针,但由于同样的原因失败了。

然而,工作示例最终是:

const int (&p)[4] = *begin;

它使用另一个相同类型的引用初始化一个引用,并添加一个const。这是完全正确的。

for(int p[4] : ia)

将尝试复制数组。这在C++中是不允许的。

for(const int(&p)[4] : ia)

使用引用来迭代数组,并且不复制它们的元素。第二个代码片段:

int &p = c;

p是对int引用,它不能引用对int的指针。以下内容有效:

int *&p = c; // reference to c
int &r = *c; // reference to int pointed to by c