On Feb 26, 7:03 pm, Juha Nieminen <nos...@thanks.invalid> wrote:
> Richard Herring wrote:
> > No. According to 5.9/2 [expr.rel], among other restrictions:
> > "If two pointers p and q of the same type point to different objects
> > that are not members of the same object or elements of the same array or
> > to different functions, or if only one of them is null, the results of
> > p<q, p>q, p<=q, and p>=q are unspecified."
> I understand that to mean that if you have two pointers,
> there's no way of knowing if the first one will evaluate as
> "smaller than" the second one (other than actually testing
> with "p < q"). In other words, you can't assume that if you
> eg. allocated two blocks of memory to two pointers, the first
> pointer will evaluate to be "smaller than" the second one. It
> can be either way, there's no guarantee.
I'm not sure that even that is guaranteed, but even if it is, it
isn't enough to provide an ordering relationship. You also have
the requirement (in the standard library) that if !(a<b) and
!(b<a), a and b are equal. I've used implementation (of C---it
was a long time ago) where a<b returned false for all pointers
returned by malloc. Regardless of the order of the comparison.
> However, if you have two pointers p and q, and p evaluates to
> be "smaller than" q, it will *always* do so. The "p < q" will
> not give random results, but it will always give true in this
> case.
> In other words, if the values of p and q don't change, then
> the value of "p < q" will never change either.
Which doesn't help if it's always false, regardless of the
pointers.
(It's interesting to note that this is different than in C,
where the behavior is simply undefined.)
> This means that pointers can indeed be used in a set/map
> without any problems. You just can't know in which order they
> will end up there, that's all.
It means that the < operator doesn't define a strict ordering
over pointers, and so it cannot be used when ordering is
required in the standard.
--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|