[问题] 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