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 HTH, -- David Abrahams [EMAIL PROTECTED] * http://www.boost-consulting.com Boost support, enhancements, training, and commercial distribution _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost