Fix the const-ness of iterator_facade_base::operator-> and
iterator_facade_base::operator[]. This is a follow-up to
1b651be0465de70cfa22ce4f715d3501a4dcffc1, which fixed const-ness of
various iterator adaptors.
Iterators, like the pointers that they generalize, have two types of
const.
- The const qualifier on members indicates whether the iterator itself can be changed. This is analagous to int *const.
- The const qualifier on return values of operator*(), operator[](), and operator->() controls whether the the pointed-to value can be changed. This is analogous to const int*.
If an iterator facade returns a handle to its own state, then T (and
PointerT and ReferenceT) should usually be const-qualified. Otherwise,
if clients are expected to modify the state itself, the field can be
declared mutable or a const_cast can be used.
Depends on a couple of in-flight patches.
clang-format: please reformat the code