On 01/25/2010 02:42 PM, Erik Trulsson wrote: > On Mon, Jan 25, 2010 at 02:19:04PM +0100, Richard Guenther wrote: >> On Mon, Jan 25, 2010 at 1:24 PM, Piotr Wyderski >> <piotr.wyder...@gmail.com> wrote:
>>> I have a hash function hash(T v) overloaded for all integral >>> types. I want to provide a variant for float and double, which >>> should work as follows: take the floating-point value, treat its >>> binary representation as uint32_t/uint64_t and use the result as a >>> parameter for an integral hash(). >>> >>> However, GCC warns me about strict aliasing rules violation, which >>> is technically correct, but in this case is intended. How do I >>> perform this conversion ina GCC-friendly way? Even that produces a >>> warning: >>> >>> inline hash_type hash(float v) { >>> >>> return hash(*reinterpret_cast<const >>> std::uint32_t*>(reinterpret_cast<const char*>(&v))); >>> } >>> >>> but I expected char* to be allowed to alias anything. >> >> But your access is via std::uint32_t *, not char. Use a >> union like >> >> union { float f; uint32 i; } u = {.f = v}; >> return u.i; > > Nope, that is not allowed either. Of course it is allowed. It's a legitimate gcc extension, and it's supported by many other compilers too. Andrew.