C++ named requirements: LegacyBidirectionalIterator
    A LegacyBidirectionalIterator is a LegacyForwardIterator that can be moved in both directions (i.e. incremented and decremented).
If a LegacyBidirectionalIterator it originates from a Container, then it's value_type is the same as the container's, so dereferencing (*it) obtains the container's value_type.
[edit] Requirements
The type It satisfies LegacyBidirectionalIterator if
-  The type Itsatisfies LegacyForwardIterator
And, given
-  a and b, lvalues of type It
-  reference, the type denoted by std::iterator_traits <It>::reference
The following expressions must be valid and have their specified effects:
| Expression | Return | Equivalent expression | Notes | 
|---|---|---|---|
| --a | It& | Preconditions: 
 Postconditions: 
 | |
| a-- | convertible to const It& | It temp = a; --a; | |
| *a-- | reference | 
A mutable LegacyBidirectionalIterator is a LegacyBidirectionalIterator that additionally satisfies the LegacyOutputIterator requirements.
[edit] Notes
The begin iterator is not decrementable and the behavior is undefined if --container.begin() is evaluated.
A bidirectional iterator does not have to be dereferenceable to be decrementable (in particular, the end iterator is not dereferenceable but is decrementable).
Concept
For the definition of std::iterator_traits , the following exposition-only concept is defined.
concept __LegacyBidirectionalIterator =
    __LegacyForwardIterator<I> && requires(I i)
    {
        {  --i } -> std::same_as <I&>;
        {  i-- } -> std::convertible_to <const I&>;
        { *i-- } -> std::same_as <std::iter_reference_t <I>>;
where the exposition-only concept __LegacyForwardIterator is described in LegacyForwardIterator.
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior | 
|---|---|---|---|
| LWG 299 (N3066) | C++98 | the return type of *a-- was required to be convertible to T | changed the return type to reference[1] | 
| LWG 383 | C++98 | b was required to be dereferenceable after --a | a is required to be dereferenceable instead | 
| LWG 1212 (N3066) | C++98 | the return type of *a-- did not match the return type of *a++ required by LegacyForwardIterator | changed the return type to reference | 
- ↑ This issue was initially resolved by N2758 (iterator concepts), which was dropped later from the C++ standard.
[edit] See also
forward_iterator is a bidirectional iterator, supporting movement backwards (concept) [edit]