David Abrahams <[EMAIL PROTECTED]> writes: | Gabriel Dos Reis <[EMAIL PROTECTED]> writes: | | > David Abrahams <[EMAIL PROTECTED]> writes: | > | > | Gabriel Dos Reis <[EMAIL PROTECTED]> writes: | > | | > | > "David B. Held" <[EMAIL PROTECTED]> writes: | > | > | > | > | Does this have any merit whatsoever? | > | > | | > | > | template <typename T, typename U> | > | > | T* dangerous_cast(U* p) | > | > | { | > | > | return static_cast<T*>(static_cast<void*>(p)); | > | > | } | > | > | > | > Is it any different from reinterpret_cast<T*>(p) ? | > | | > | It might be, depending on your compiler. The behavior of | > | reinterpret_cast<T*> is implementation-defined. | > | > The mapping used by reinterpret_cast<> is implementation defined, | > thus an implementation is required to document it. | > | > 1) Do you have any corresponding guarantee for converting a void* to | > T* when the source is *not* a T* nor the address obtained from a T? | > | > 2) Isn't the mapping U* -> void* -> T* at best | > implementation-defined if not undefined behaviour? | | template <class T> | struct holder | { | union { | aligned_POD<T>::type aligner; | char storage[sizeof(T)]; | }; | }; | | holder<Foo> h; | new (h.storage) Foo; | ... | T* u = dangerous_cast<T*>(h.storage); // can't do this with reinterpret_cast
Hmm, I have a couple of questions answers to which will help me get your point. 1) Why can't you do that with reinterpret_cast? 2) Why is that supposed to be better than reinterpret_cast<>? -- Gaby _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost