Subject: Re: [std-proposals] std::iterator_static_cast & std::iterator_const_cast?
From: Arthur O'Dwyer (arthur.j.odwyer_at_[hidden])
Date: 2019-05-04 10:38:39
Notice that all standard containers already provide a ranged erase member
function which can be used to "launder" a const_iterator into an iterator
in a type-safe way.
(And of course you don't need to "launder" an iterator into a
const_iterator; that direction is already implicitly convertible.)
C::const_iterator cit = ctr.begin(); // iterator to const_iterator happens
C::iterator it = ctr.erase(cit, cit); // const_iterator to iterator is
always doable, but requires non-const access to the container itself
If you have a const_iterator and you *don't* have non-const access to the
container itself, then you really *shouldn't be trying* to get a non-const
iterator. That would break type-safety.
P.S., just throwing this out there, not a serious suggestion â if you make
`iterator` a private base class of `const_iterator`, then you can use a
C-style cast (and *only* a C-style cast) to perform the unsafe conversion
from const_iterator to iterator. A *private* inheritance relationship is
usually indistinguishable from *no* inheritance relationship, but unsafe
casts are one place where even a private relationship can come to light.
STD-PROPOSALS list run by herb.sutter at gmail.com
Standard Proposals Archives on Google Groups