楼主:
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++不会去检查边界,如果有边界检查那这个就要修一下了)
感谢
楼主:
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:00range-based for取出的object,都是能被合法存取的那条指的难道不是像vector<int> vec;copy(begin(vec),begin(vec)+1);这种的吗?在[begin,end)里面的object,都是安全的。range-basedfor也是基于这些而建立的
楼主:
wtchen (没有存在感的人)
2016-05-12 20:34:00array也可以用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:00range-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:00array还要有known size而且不是incomplete type...
作者:
kwpn (ITSST)
2016-05-12 21:00:00end遇到array会是template T* end(T(&array)[N])之类
楼主:
wtchen (没有存在感的人)
2016-05-12 21:11:00这样我就懂了,原来有这个template...