Here's the train of intuition:
1) dyn requires a pointer that may be to one of multiple types of structs
2) a group of multiple types of structs has an undefined memory layout, so the value must either live on the heap or be wrapped up in an enum
That feels like an airtight understanding. But then Rust lets you do this weird juggling maneuver based on control-flow that allows you to do it on the stack.
I'm not saying Rust shouldn't let you do this, and I'm not really sure how it could be made intuitive given the "normal" case. I'm just expressing that subjectively, this feels very weird and non-obvious, and it's far from the first example like this that I've encountered. Here's another example: https://news.ycombinator.com/item?id=25595120