你有一种误解,认为远程需要提前知道迭代次数(“长度”).它不是.
它确实需要一个终止条件,其形式为!= __end,其中__end = x.end()或__end = end(x).
当然,数组不能改变它们的大小,因此在这种情况下检测结束并知道长度是等效的(长度可以从开始,结束和指针减法得到).
正如Oli在评论中提到的,数组的类型确实包含长度信息,而std :: end对其参数使用数组引用,以避免衰减丢失此信息的指针.
定义基本上是:
namespace std
{
template
T* end(T (&array)[N])
{
return array + N;
// or if you want to be cute
// return 1[&array];
}
}
当数组引用中的边界是非类型模板参数时,它是可推导的.在编写接受数组的函数时,使用此优势.
(编译器实际上对数组的内置结构进行了数组N计算,它没有使用std :: end().但是无论如何内联后都没有区别,看看你怎么做很有用发挥编译器的相同技巧.)