[问题] range for with multidimensional arrays

楼主: woody3724 (woody)   2017-04-20 18:18:12
目前正在读 C++ Primer 5th edition
int ia[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
for(auto row : ia)
for(auto col : row)
cout<< col <<endl;
这样子compile是不会过的
外层循环的row必须要是reference才行,也就是 &row
书上的理由如下:
Because row is not a reference, when the compiler initializes row it will
convert each array element (like any other object of array type) to a pointer
to that array's first element. As a result, in this loop the type of row is
int*, The inner for loop is illegal. Despite our intentions, that loop
attempts to iterate over an int* .
reference不就是让一个变量有了另一个名称,并且这两个名称都使用同一块内存
位址吗?
为什么有reference的话,each array element就不会被转换成指向第一个元素的指标?
请问为什么row要reference呢
谢谢
作者: LPH66 (-6.2598534e+18f)   2017-04-20 21:36:00
ia 的形态是 int[3][4], 或曰“长度为 3 的 int[4] 阵列”也就是其元素形态是 int[4], 根据规则一个如此形态的值会 decay 成指向其首元素的指标, 这就是文中在讲的那个也就是说, 第一个 auto 会被推断为 int[4] 然后发生 decay但如果是参考的话, int(&)[4] 是一个对如此阵列的参考这样就不会被 decay 而可以进行内层的 for 了
作者: hunandy14 (Charlott.HonG)   2017-04-27 13:26:00
改成 auto& 就可以是因为这样就会直接抓参考吗阿 没事我懂了 int& arr 卡了一下...

Links booklink

Contact Us: admin [ a t ] ucptt.com