为什么二维数组中的Range以这种方式写入?

时间:2015-12-11 17:04:42

标签: c++ arrays pointers reference

这是来自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(&amp; p)[4]。

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

更多信息,我知道这段代码不起作用:

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

引用无法通过指针初始化,但根据编译器给出的错误,似乎就是这个范围内的情况。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

在range-for循环机制中(描述here),会发生与此类似的事情:

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。这完全有效。