[問題] (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