You’re an imposter! Mr. borrowck would know this, on account of being the borrow checker!
But to answer your question, whoever you are: because *b is of type u32, but is not a u32 value. That is, the compiler distinguishes internally between “this is a u32 value” and “this is the location of a u32 value”. *b is the second one. Because it’s a location, it can re-reference it without having to copy the value out first.
A real temporary (like the result of a function call, or a literal, or the result of addition… any value which doesn’t have a storage location) would be the first kind.