# Bidirectional Traversal Concept

A class or built-in type `X` models the Bidirectional Traversal concept if, in addition to `X` meeting the requirements of Forward Traversal Iterator, the following expressions are valid and respect the stated semantics.

Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal Iterator)
Expression | Return Type | Assertion/Semantics / Pre-/Post-condition
--- | --- | ---
`--r` | `X&` | pre: there exists `s` such that `r == ++s`. post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.
`r--` | convertible to `const X&` |
    {
      X tmp = r;
      --r;
      return tmp;
    }
`iterator_traversal<X>::type` | Convertible to `bidirectional_traversal_tag` |