Iterators: distance versus operator- argument types.

Wed Aug 25 15:51:00 GMT 2010

Hi Ian again,

Great, I haven't noticed that deffect report, which I found at

Now it's clear! It's explicitly allowed and that's was I was trying to

Before, I have taken a look at the last working draft (n3090) but
didn't find the answer. Now with the clue of what's reported in that
DR, I found clause 7 from "23.2.1 General container requirements"
which says what you say:

"In the expressions ... i - j ... where i and j denote objects of a
container’s iterator type, either or both may be replaced by an object
of the container’s const_iterator type referring to the same element
with no change in semantics."

Regarding the implementation, I saw that the operator- was forwarding
the call. What I understood was that if any conversion was taking
place then I wouldn't be in the actual iterator (or const_iterator)
type (which in the guts is normal_iterator) but in some other type,
which may be the base, for instance; but what the standard talked
about was conversion between iterator and const_iterator, but not
between their base classes.

Now, it's another issue (of the C++ standard) that std::distance is
not interchangable with operator-.

Also that added paragraph 7 talks about iterators in general, whereas
some of the quoted operations are only presented in random-access ones
(among them operator-).

Cheers, and thanks a lot for your clarifications and responses.
Rodolfo Federico Gamarra

On Wed, Aug 25, 2010 at 01:34, Ian Lance Taylor <> wrote:
> rgamarra <> writes:
>> To check and see what's going on, I did
>> g++ -E
>> , got the full sources and modified the operator- by adding (with the
>> proper #include <typeinfo>)
> The operator- you mentioned before is the one for normal_iterator.  You
> can see that it just calls operator- again on the base class.
> The standard (at least, DR179) requires that operator- accept a
> combination of iterator and const_iterator.  Since this version of
> operator- is just going to call operator- again, it needs to accept
> different types in the template.
> Ian

More information about the Gcc-help mailing list