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

作者: wtchen (沒有存在感的人)   2016-05-12 20:07:33
昨晚編修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++不會去檢查邊界,如果有邊界檢查那這個就要修一下了)
感謝
作者: Caesar08 (Caesar)   2016-05-12 20:17:00
http://en.cppreference.com/w/cpp/language/range-for要提供begin, end,不然就是C形式的array你要standard的話,N4582, 6.5.4就有了
作者: wtchen (沒有存在感的人)   2016-05-12 20:24:00
看起來這個end是來自邊界檢查?
作者: Caesar08 (Caesar)   2016-05-12 20:26:00
我想先知道甚麼是邊界檢查
作者: wtchen (沒有存在感的人)   2016-05-12 20:27:00
確定寫入的地方是不是該變數的有效範圍?"C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過"這是13誡-2裡的描述...
作者: Caesar08 (Caesar)   2016-05-12 20:31:00
range-based for取出的object,都是能被合法存取的那條指的難道不是像vector<int> vec;copy(begin(vec),begin(vec)+1);這種的嗎?在[begin,end)裡面的object,都是安全的。range-basedfor也是基於這些而建立的
作者: wtchen (沒有存在感的人)   2016-05-12 20:34:00
array也可以用range-based for這種不先檢查陣列索引值是要怎麼做range-based for?
作者: bibo9901 (function(){})()   2016-05-12 20:37:00
就是begin(arr) 和 end(arr) 之間呀
作者: Caesar08 (Caesar)   2016-05-12 20:42:00
對於C形式的array,只要你知道這個array大小是多少,range-based for就會幫你設定大小簡單來說,用range-based for取出來的object絕對安全不管你是array,或是有提供"正確"begin, end的class
作者: wtchen (沒有存在感的人)   2016-05-12 20:44:00
range-base for應該不能用在用引數傳入的pointer吧?例如 int a(int* b){裏面應該不能對b用range-based for}
作者: Caesar08 (Caesar)   2016-05-12 20:47:00
只接受"array"與有begin, end的class......
作者: wtchen (沒有存在感的人)   2016-05-12 20:49:00
array還要有known size而且不是incomplete type...
作者: kwpn (ITSST)   2016-05-12 21:00:00
end遇到array會是template T* end(T(&array)[N])之類
作者: LPH66 (-6.2598534e+18f)   2016-05-12 21:09:00
http://en.cppreference.com/w/cpp/iterator/end(2) 那個即是給陣列用的, 型式如樓上所言也就是要有 N 才能傳得進這裡去, 不然會被 SFINAE 掉
作者: wtchen (沒有存在感的人)   2016-05-12 21:11:00
這樣我就懂了,原來有這個template...

Links booklink

Contact Us: admin [ a t ] ucptt.com