Example 1: Supporting mutating and nonmutating access to the elements of the underlying collection.

typedef sequence_range<std::vector<int> >  range_t;

void f1(range_t &r);
void f2(range_t const &r);

range_t       r;
const range_t cr;

f1(r);  // non-const passed as non-const - Ok
f2(r);  // non-const passed as const - Ok
f2(cr); // const passed as const - Ok
f1(cr); // const passed as non-const - compile error