[問題] C++11以後對array的for loop是否檢查邊界

看板C_and_CPP作者 (沒有存在感的人)時間9年前 (2016/05/12 20:07), 9年前編輯推噓2(2027)
留言29則, 5人參與, 最新討論串1/1
昨晚編修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

05/12 20:19, , 2F
要提供begin, end,不然就是C形式的array
05/12 20:19, 2F

05/12 20:22, , 3F
你要standard的話,N4582, 6.5.4就有了
05/12 20:22, 3F

05/12 20:24, , 4F
看起來這個end是來自邊界檢查?
05/12 20:24, 4F

05/12 20:26, , 5F
我想先知道甚麼是邊界檢查
05/12 20:26, 5F

05/12 20:27, , 6F
確定寫入的地方是不是該變數的有效範圍?
05/12 20:27, 6F

05/12 20:29, , 7F
"C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過"
05/12 20:29, 7F

05/12 20:29, , 8F
這是13誡-2裡的描述...
05/12 20:29, 8F

05/12 20:31, , 9F
range-based for取出的object,都是能被合法存取的
05/12 20:31, 9F

05/12 20:33, , 10F
那條指的難道不是像vector<int> vec;
05/12 20:33, 10F

05/12 20:33, , 11F
copy(begin(vec),begin(vec)+1);這種的嗎?
05/12 20:33, 11F

05/12 20:34, , 12F
在[begin,end)裡面的object,都是安全的。range-based
05/12 20:34, 12F

05/12 20:34, , 13F
for也是基於這些而建立的
05/12 20:34, 13F

05/12 20:34, , 14F
array也可以用range-based for
05/12 20:34, 14F

05/12 20:35, , 15F
這種不先檢查陣列索引值是要怎麼做range-based for?
05/12 20:35, 15F

05/12 20:37, , 16F
就是begin(arr) 和 end(arr) 之間呀
05/12 20:37, 16F

05/12 20:42, , 17F
對於C形式的array,只要你知道這個array大小是多少,
05/12 20:42, 17F

05/12 20:42, , 18F
range-based for就會幫你設定大小
05/12 20:42, 18F

05/12 20:43, , 19F
簡單來說,用range-based for取出來的object絕對安全
05/12 20:43, 19F

05/12 20:44, , 20F
不管你是array,或是有提供"正確"begin, end的class
05/12 20:44, 20F

05/12 20:44, , 21F
range-base for應該不能用在用引數傳入的pointer吧?
05/12 20:44, 21F

05/12 20:45, , 22F
例如 int a(int* b){裏面應該不能對b用range-based for}
05/12 20:45, 22F

05/12 20:47, , 23F
只接受"array"與有begin, end的class......
05/12 20:47, 23F

05/12 20:49, , 24F
array還要有known size而且不是incomplete type...
05/12 20:49, 24F

05/12 21:00, , 25F
end遇到array會是template T* end(T(&array)[N])之類
05/12 21:00, 25F

05/12 21:09, , 26F

05/12 21:10, , 27F
(2) 那個即是給陣列用的, 型式如樓上所言
05/12 21:10, 27F

05/12 21:11, , 28F
也就是要有 N 才能傳得進這裡去, 不然會被 SFINAE 掉
05/12 21:11, 28F

05/12 21:11, , 29F
這樣我就懂了,原來有這個template...
05/12 21:11, 29F
文章代碼(AID): #1ND788bL (C_and_CPP)