Re: STL map question : directed to stl map expert(s)....
Craig Scott ha scritto:
There were some minor clarifications of some of these points in the
discussions that followed, but this will suffice for what I want to ask
here. Firstly though, I'd appreciate it if someone could point me at the
part of the standard which talks about comparing pointers for inequality
being valid only if they both point into the same array.
Right in 5.9. Actually, the result of the comparison of *valid* pointers
pointing to element not in the same array is unspecified. It does not
lead to undefined behaviour.
The above-quoted comments get interesting if you have a std::map where the
key_type is a pointer. The default comparison for such a map is
less<key_type>, which for a pointer has default implementation a < b. Now
Although less<> is defined in terms of operator<, there is an additional
requriement for pointer types in 20.3.3/8: "For templates greater, less,
greater_equal, and less_equal, the specializations for any pointer type
yield a total order, even if the built-in operators <, >, <=, >= do not."
I'm wondering under what circumstances such comparisons are technically
legal. I'd be interested in which of the following cases are valid and
which are not:
int a[2] = { 6, 7 }
int b = 1;
int c = 2;
std::map<int*,int> myMap1;
myMap1[&a[0]] = 15; // (1)
myMap1[&a[1]] = 16; // (2)
myMap1[&b] = 17; // (3)
std::map<int*,int> myMap2;
myMap[&b] = 25; // (4)
myMap[&c] = 26; // (5)
Will any of (1)-(5) lead to undefined behavior? From what I've understood of
the thread quoted, there would seem to be a good case for (3) and (5) to be
undefined behavior, but if this is true then this would seem to be a
surprising result (to me at least).
None of the cases lead to undefined behaviour, because of the extra
guarantee provided bty std::less.
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]