----- Original Message -----
From: "David Abrahams" <[EMAIL PROTECTED]>

> > template<class> struct test;
> >
> > template<class R, class C> struct test<R C::*> {
> >     typedef R type;
> > };
> >
> > struct X { };
> >
> > test< void (X::*)(int) >::type // what type is this?
> >
> > Is it a function type, or is it a "member function type"?
>
> If it's legal, it's a function type.  Interestingly, MWCW seems to
> think it's:
>
>       void (void *const , const void *const , int)

Weird.

> But none of the other compilers seem to think it's a function type.  I
> know that when Howard mentioned that he thought it was natural to get
> a function type by stripping the "pointer to member" part from a
> pointer to member function in some committee discussion, it generated
> a little bit of surprisee at least.

Yeah, what about "void (X::*)(int) const"?  It seems like it is of type
"member function type" since, for obvious reasons, a freestanding function
cannot be cv-qualified.

> I can't tell what EDG thinks it is, but whatever it is, it's not a
> function type.

EDG treats it like a special type of function type.  For instance, trying to
apply const to it yields a "applying const to a function-type" error.  Also,
'typeid(R).name()' yields "void (int)" which is, of course, a function type.
However, 'is_same<R, void (int)>::value' yields false.  On the other hand,
'typeid(R).name()', when 'R' is from a const-qualified
pointer-to-member-function, yields "void (int) const", which is obviously
*not* a function type.  The best I can make out is that EDG treats it as a
"member function type".

> GCC thinks it's illegal.

Which part?  Just the existence of 'R' at all?  If that is the case, than
GCC is wrong.  It looks like we have a hole in the type system here.  The
specialization:  R C::* should catch all pointers-to-members, including
pointers-to-member-functions.  Therefore, the type 'R' exists, but has no
name, and is nothing that you could specify by yourself.

Paul Mensonides

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to