|
Boost : |
From: David B. Held (dheld_at_[hidden])
Date: 2002-12-04 15:01:44
"Gabriel Dos Reis" <gdr_at_[hidden]> wrote in message
news:m33cpdpovs.fsf_at_uniton.integrable-solutions.net...
> David Abrahams <dave_at_[hidden]> 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
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk