Обратные итераторы (один перед первым элементом) и неопределенное поведение? - PullRequest
1 голос
/ 25 ноября 2011

При работе с указателями указатели на один за концом имеют (в основном) определенное поведение:

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 ]

1 голос
/ 25 ноября 2011

Обратные итераторы на самом деле не являются итераторами.Они больше похожи на «адаптеры итераторов».Вы можете вызвать функцию-член base() в обратном итераторе, чтобы получить реальный итератор, и это приведет к смещению -1, так что rbegin().base() == end() и rend().base() == begin().Следовательно, нет необходимости в явном значении указателя «перед началом» или что-то в этом роде.(За исключением forward_list конечно.)

0 голосов
/ 25 ноября 2011

Это не неопределенно, если вы не разыменовываете указатель за любым концом.

[0] - это начало, а не [1]. [-1] - это один перед [0].

Синтаксис &a[b] обрабатывается компилятором так же, как и a + b.

0 голосов
/ 25 ноября 2011

В соответствии со стандартом [24.4.1 / 1] соотношение между обратным итератором и базой:

&*(reverse_iterator(i)) == &*(i - 1)

Так что нет, до начала массива нет никаких дополнений.И вышеописанным способом определяется поведение в соответствии со стандартом.

...