Re: Portability of comparing pointers to void
On Oct 28, 11:02 am, "Matthias Hofmann" <hofm...@anvil-soft.com>
wrote:
"Matthias Hofmann" <hofm...@anvil-soft.com> schrieb im Newsbeitragnews:5ofg50Fmfjn1U1@mid.individual.net...
Meanwhile I did some further research on partial ordering, strict weak
ordering and total ordering and things are a little clearer for me now, but
there are still two things that keep me wondering:
1.) As far as I understand strict weak ordering, two elements of a set may
be incomparable as long as this incomparability relation is transitive. If
this is true, then the following should be fine?
#include <set>
template <class T> struct strict_weak_less;
template <> struct strict_weak_less<int>
{
bool operator()( int a, int b )
{
// Define any two elements
// to be incomparable unless
// they are equal.
return a != b;
}
};
No, the above functor provides no ordering at all between a and b. For
a and b to be ordered, the result of evaluating a < b and b < a must
match one of the three cases listed below:
a < b b < a
1. true false
2. false true
3. false false
The above functor (when a != b) reports:
a < b b < a
1. true true
a truth table which clearly makes it impossible to decide which of the
two objects ("a" or "b") should be ordered before the other.
(I
have searched for a real life example for a strict weak ordering that is
not
a total ordering, but I have not found any. Does anyone know an example?)
Just define a class that implements less-than comparisons between
class objects but does not implement equality comparisons between
class objects.
The existence of a strict weak ordering for a set of objects, means
that it is possible to tell whether one object precedes another (or
whether the two objects have the same precedence). But a strict weak
ordering does not guarantee that it is possible to tell whether two
objects are "equivalent".
2.) Why does the standard require a strict weak ordering for associative
containers, but guarantee a total ordering for std::less<T*> in
20.3.3/8?
Because pointers can be compared for equality (with the equality
operator: ==). So a strict weak ordering for pointers becomes a total
ordering because an equality comparison is defined. (Note that a
strict weak ordering also imposes a total ordering, if
(not(a < b) and not(b < a))
defines an equivalence relation between a and b.)
Shouldn't the standard require a total ordering for
std::less for *any* type, not just for pointers?
Then a type would have to support equality comparisons in addition to
relational comparisons, in order to qualify as a type parameter to
std::less<>. Yet equality comparisons may not make much sense for
certains classes - nor is it clear what imposing this additional
requirement would accomplish.
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]