反转迭代器(第一个元素之前的一个)和未定义的行为?

时间:2011-11-25 03:31:18

标签: c++ pointers iterator undefined-behavior

在处理指针时,指向一个结尾的指针(主要)定义了行为:

int array[8];
int* x = array + 8; // Still considered pointing to part of array in expressions

迭代器通过将迭代器指针与结束时的迭代器指针进行比较来使用它。

反向迭代器执行相同的操作,但在数组启动之前执行一次:

int array[8];
int* x = array - 1;

这不是未定义的行为吗?容器是否包含额外元素并考虑[1]开始?

3 个答案:

答案 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完全相同。