[问题] (C++ Primer)有关auto &的疑问

楼主: TyrionLannis (小恶魔)   2018-12-07 20:58:43
由于不是问程式码相关的题目,故前面叙述恕删,最近刚开始看C++ Primer,
读到Ch3多维阵列的部分(P128),它里面给了另一种用auto来跑for loop的方式,举个
例子来说:
int ia[2][2]={1,2,3,4};
//印出阵列的每个元素值
for(auto &row : ia)
for(auto col :row){
cout<< col << endl;
}
书中注明,auto &row中的&不能省略,否则编译器会把row转成一个pointer(指
向每列的第一个元素),跑到第二个loop的时候就变成违法的指令了(原文:That
loop attempts to iterate over an int*),所以说一定要要有&才会把row转成
一个一维阵列,然后我就有点不懂为什么编译器会这样做了,毕竟前面讲auto的
内容好像没有有提到auto声明的时候加上reference会造成这种最后type的不同,
想请问这是C++的规定还是背后有什么特别的哲学(或者机制)吗?
作者: poyenc (发箍)   2018-12-07 22:34:00
这跟 range-based foor 会用到的操作有关https://bit.ly/2Stce3G 有看过 iterator 相关的章节吗?range-based for 就是简化以迭代器寻访集合的语法糖, 如果你之前有看过迭代器来寻访 vector 的章节, 那这边的原理是一样的, 只是需要先照我上面贴的连结提到的, 把begin_expr 跟 end_expr 找出来, 刚好阵列会透过array-to-pointer conversion 转成指标. 先试着自己展开一层试试刚开始用一维的阵列来作会简单些还是回一下文好惹 :o
作者: firejox (Tangent)   2018-12-08 11:29:00
简单讲 auto 是pass valueauto&是 pass reference

Links booklink

Contact Us: admin [ a t ] ucptt.com