在处理指针时,指向一个结尾的指针(主要)定义了行为:
int array[8];
int* x = array + 8; // Still considered pointing to part of array in expressions
迭代器通过将迭代器指针与结束时的迭代器指针进行比较来使用它。
反向迭代器执行相同的操作,但在数组启动之前执行一次:
int array[8];
int* x = array - 1;
这不是未定义的行为吗?容器是否包含额外元素并考虑[1]
开始?
答案 0 :(得分:1)
反向迭代器不是真正的迭代器。它们更像是“迭代器适配器”。您可以在反向迭代器上调用base()
成员函数,以便返回一个真正的迭代器,这会导致-1偏移,因此rbegin().base() == end()
和rend().base() == begin()
。因此,不需要明确的“在开始之前”指针值或类似的东西。 (当然,forward_list
除外。)
答案 1 :(得分:0)
根据标准[24.4.1 / 1],反向迭代器与基础之间的关系是:
&*(reverse_iterator(i)) == &*(i - 1)
所以不,在数组开始之前没有任何填充。并且上述方法是根据标准定义的行为。
答案 2 :(得分:0)
只要您不将指针取消引用到任何一端,它就不会被定义。
[0]
是开始,而不是[1]
。 [-1]
之前是[0]
。
编译器将&a[b]
语法视为与a + b
完全相同。