看板 C_and_CPP 關於我們 聯絡資訊
昨晚編修13誡的時候突然想到, C++11之後我們可以優雅地取出vector或array的element。 //vector: std::vector<int> v = {0, 1, 2, 3, 4, 5}; for(const int &i : v) // access by const reference std::cout << i << ' '; std::cout << '\n'; //array: int a[] = {0, 1, 2, 3, 4, 5}; for(int n: a) // the initializer may be an array std::cout << n << ' '; std::cout << '\n'; 請問這是否表示C++11以後已經增加了邊界檢查的動作? 還是他是用其他的方法去實踐以上的作法? (因為13誡-2有強調C/C++不會去檢查邊界,如果有邊界檢查那這個就要修一下了) 感謝 -- 個人網頁:http://gnitnaw.github.io/ 以後在C_and_CPP或LinuxDev發表的文章都會放一份在這邊。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 86.209.153.222 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1463054856.A.955.html ※ 編輯: wtchen (86.209.153.222), 05/12/2016 20:07:48
Caesar08: 要提供begin, end,不然就是C形式的array 05/12 20:19
Caesar08: 你要standard的話,N4582, 6.5.4就有了 05/12 20:22
wtchen: 看起來這個end是來自邊界檢查? 05/12 20:24
Caesar08: 我想先知道甚麼是邊界檢查 05/12 20:26
wtchen: 確定寫入的地方是不是該變數的有效範圍? 05/12 20:27
wtchen: "C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過" 05/12 20:29
wtchen: 這是13誡-2裡的描述... 05/12 20:29
Caesar08: range-based for取出的object,都是能被合法存取的 05/12 20:31
Caesar08: 那條指的難道不是像vector<int> vec; 05/12 20:33
Caesar08: copy(begin(vec),begin(vec)+1);這種的嗎? 05/12 20:33
Caesar08: 在[begin,end)裡面的object,都是安全的。range-based 05/12 20:34
Caesar08: for也是基於這些而建立的 05/12 20:34
wtchen: array也可以用range-based for 05/12 20:34
wtchen: 這種不先檢查陣列索引值是要怎麼做range-based for? 05/12 20:35
bibo9901: 就是begin(arr) 和 end(arr) 之間呀 05/12 20:37
Caesar08: 對於C形式的array,只要你知道這個array大小是多少, 05/12 20:42
Caesar08: range-based for就會幫你設定大小 05/12 20:42
Caesar08: 簡單來說,用range-based for取出來的object絕對安全 05/12 20:43
Caesar08: 不管你是array,或是有提供"正確"begin, end的class 05/12 20:44
wtchen: range-base for應該不能用在用引數傳入的pointer吧? 05/12 20:44
wtchen: 例如 int a(int* b){裏面應該不能對b用range-based for} 05/12 20:45
Caesar08: 只接受"array"與有begin, end的class...... 05/12 20:47
wtchen: array還要有known size而且不是incomplete type... 05/12 20:49
kwpn: end遇到array會是template T* end(T(&array)[N])之類 05/12 21:00
LPH66: (2) 那個即是給陣列用的, 型式如樓上所言 05/12 21:10
LPH66: 也就是要有 N 才能傳得進這裡去, 不然會被 SFINAE 掉 05/12 21:11
wtchen: 這樣我就懂了,原來有這個template... 05/12 21:11