Anthony Williams <[EMAIL PROTECTED]> writes:

|  > Anthony Williams <[EMAIL PROTECTED]> writes:
|  > 
|  > [...]
|  > 
|  > | 3.10p15:
|  > |   "If a program attempts to access the stored value of an object through an
|  > |   lvalue of other than one of the following types the behavior is undefined:
|  > | 
|  > |   - the dynamic type of the object,
|  > | 
|  > |   ...
|  > | 
|  > |   - a char or unsigned char type."
|  > | 
|  > | So given a Foo object foo, static_cast<char*>(static_cast<void*>(&foo)) is
|  > | legal, and can be used to access the object representation of the object.
|  > 
|  > There is no question that the above cast is legal.  I thin the issue
|  > is elsewhere.  The key question is whether that may be different from
|  > 
|  >    reinterpret_cast<void*>(&foo);
| 
| I thought the issue was whether the pair of static_cast<>s in dangerous_cast<>
| was as implementation defined as a reintepret_cast<> would be. If you read my
| mail to the end, hopefully I have explained that I think that the
| static_cast<> pair is legal and well-defined, as opposed to using
| reinterpret_cast, which is implementation-defined. If I haven't made myself
| clear, I apologise, and will try again.

You made youself clear.

However, there are two running issues originating from a claim of Dave
that dangerous_cast<> might be better than reinterpret_cast<> in
casting from U* to T* (dangerous_cast<> uses the intermediate step
void* via static_cast<>).

  1) is dangerous_cast<> better than reinterpret_cast<>?

  2) is it well-defined to dereference the value obtained from

       U* -> void* -> T*
    
     ?

You've showed that si U == char, (the case in Dave's example) then it
is well-formed.  The other cases are left undefined.

So the key question (1) is still unanswered.

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

Reply via email to