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