这是来自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;
引用无法通过指针初始化,但根据编译器给出的错误,似乎就是这个范围内的情况。
答案 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
。这完全有效。