Re: map allocator
"Mycroft Holmes" <m.holmes@nospam.it> wrote in message
news:eA$ZC9UgJHA.4052@TK2MSFTNGP05.phx.gbl
simplifying the problem a bit, we want to detect if an object of type
T is convertible to std::CONT<K,V,L,ALLOC>::const_iterator
where CONT may be map/multimap and K,V,L and ALLOC are known.
we are investigating to see what happens if (by mistake) the user is
using a map declared with... the wrong allocator, since
std::CONT<K,V,L,ALLOC<T1>
const_iterator and std::CONT<K,V,L,ALLOC<T2> >::const_iterator
might be
different, even if both containers end up to be identical (thanks to
allocator::rebind).
If Alloc::value_type differs from CONT<..., Alloc>::value_type, then
such a class is not a valid container per 23.1 Table 65 Container
Requirements. The table requires that Container::reference be a typedef
for Container::value_type&. All standard containers define
Container<..., Alloc>::reference as Alloc::reference, which in turn is
required to be Alloc::value_type& per 20.1.5 Table 32 Allocator
Requirements.
As the class is not a container, the standard places no requirements on
it one way or another.
Btw, We noticed that this compiles:
std::vector<double, MYALLOC<double> > V1;
std::vector<double, MYALLOC<int> > V2; // <-- wrong: I pass int
V1.begin() == V2.begin();
So it seems that (at least some) iterators have the same (or
convertible) static type.
I'm not sure this is a requirement...
It is not. As I said, V2 is not a container in the standard-specified
sense, so the standard says nothing about what its begin() method would
return or whether it should have begin() method at all. The program
above may or may not compile, and may or may not be valid, depending on
implementation details. The standard doesn't specify or guarantee any
particular behavior for it.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925