"Gabriel Dos Reis" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> David Abrahams <[EMAIL PROTECTED]> writes:
>
> | [...]
> |      if is_pointer<source_type> and is_pointer<dest_type>
> |         return (dest_type)(
> |                  (unisgned)src
> |                         ^ sizeof(remove_pointer<source_type>::type)
> |                          ^ sizeof(remove_pointer<dest_type>::type));
>
> And why isn't that applicable to the trip
>
>     char* -> void* -> Foo*

First of all, because that trip with reinterpret_cast<> is even more
implementation-defined than char* -> Foo*.  Second, because that
trip isn't even being proposed for reinterpret_cast<>, it's being
proposed for static_cast<>.  And third, Dave's "perverse
implementation" only applies to reinterpret_cast<>, not
static_cast<>.  For the static_cast<> trip, consider:

4.10 Pointer conversions

    2 An rvalue of type "pointer to cv T," where T is an object
    type, can be converted to an rvalue of type "pointer to cv
    void." The result of converting a "pointer to cv T" to a "pointer
    to cv void" points to the start of the storage location where the
    object of type T resides, as if the object is a most derived
    object (1.8) of type T (that is, not a base class subobject).

char* -> void*

and

5.2.9 Static cast

    10 An rvalue of type "pointer to cv void" can be explicitly
    converted to a pointer to object type. A value of type pointer
    to object converted to "pointer to cv void" and back to the
    original pointer type will have its original value.

void* -> Foo*

Note that "implementation defined" and "undefined" do not
appear in either of those paragraphs.  Maybe the standard
is not sufficiently clear to determine whether char* -> void* ->
Foo* has the intended effect.  However, that seems to be a
legal reading of it.

Dave





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

Reply via email to