Travis Vitek wrote:
>
>
>Farid,
>
>It seems that this change would cause some potentially serious problems
>in two different cases.
>
> 1. _TypeT is a UDT with an implementation of operator& that returns
>something that isn't convertible to a pointer type. [compile error]
> 2. _TypeT is a UDT with an implementation of opreator& that returns
>something convertible to pointer, but the returned value is not the
>address of the object. [runtime error]
>
>I see no reason that either of these cases would not be legal. I think
>you should be using the allocator_type::address() to get the physical
>address of a given object.
>
>Here is a simple testcase that illustrates the compile failure that was
>introduced with this change.
>
FWIW, it appears that this problem exists when calling other methods of
std::vector<S>. The vector implementation uses the function templates
std::uninitialized_copy() and std::uninitialized_fill(), both of which
require that the iterator types 'have operator* return an object for
which operator& is defined and returns a pointer to T' [20.4.4 p1].
I think this is another bug. Martin?
If so, I'll file it seperately. Here's the testcase for those who are
interested.
#include <vector> // for vector
struct S
{
void operator& () const {};
};
int main (int argc, char** argv)
{
const S s [3];
std::vector<S> v;
// this is just a compile test, it is not intended to run
v.assign (1, s [0]);
v.assign (s, s+3);
v.at (0);
v.back ();
v.begin ();
v.capacity ();
v.empty ();
v.end ();
v.front ();
v.insert (v.begin (), s [0]);
v.insert (v.begin (), s, s+3);
v.insert (v.begin (), 2, s [0]);
v.erase (v.begin ());
v.erase (v.begin (), v.end ());
v.max_size ();
v.pop_back ();
v.push_back (s[0]);
v.rbegin ();
v.rend ();
v.reserve (10);
v.resize (10);
v.size ();
std::vector<S>().swap (v);
return 0;
}