Должен ли двунаправленный итератор, достигший конца, оставаться декремментируемым в C ++?

Я пишу специальный класс итератора, который работает как std::istream_iterator и многие другие, используя созданный по умолчанию экземпляр для обозначения конца итерации. Я хочу дать ему двунаправленную категорию итератора. После запуска следующего кода:

MyIterType i_cur(get_some_iter()), i_end;
while(i_cur != i_end) ++i_cur;

Стандартные требования для двунаправленных итераторов налагают следующее, чтобы быть действительными?

  1. --i_cur
  2. ++i_cur
  3. --i_end или же ++i_end

Спасибо за цитирование стандарта, если это возможно. Я компилирую в C ++ 03, но если C ++ 11 вводит изменения, мне также интересно их знать.

2

Решение

Стандарт говорит, что ответ на ваш вопрос — да:

[C ++ 03]: 24.1.4 Двунаправленные итераторы

Table 75—Bidirectional iterator requirements (in addition to forward iterator)

expression    return type    operational    assertion/note
semantics    pre/post-coindition
========      ============   ============ ====================
--r             X&                         pre: there exists s such
that r == ++s.
post: s is dereferenceable.
--(++r) == r.
--r == --s implies r
== s.
&r == &--r
1

Другие решения

В 24.2.6 в C ++ 11 в таблице 110 приведены дополнительные требования для двунаправленного итератора.

В частности, если существует s такой, что r == ++s, затем --r должен быть действительным, и в результате r должен быть разыменованным. К тому же:

  • --(++r) == r,
  • --r == --s подразумевает r == s,
  • &r == &--r,

Так что, если начальный i_cur вернулся get_some_iter последний итератор, последний i_cur имеет предшественника и поэтому должен быть уменьшаемым. То же самое относится и к i_end, так как он является преемником финала i_cur,

1