Is the following accurate? “If a type has a generic bound T: ?Sized, then its data lives on the heap.” (Except for &T because it's the one type that doesn't take ownership of its T upon construction.)
There are no types whose fields "live on the heap", nor are there types whose fields "live on the stack"; these are simply not properties of types. Values always live exactly where you put them and you can put values anywhere you want, thanks to Rust's "all types are moveable" rule. Now something like a `Vec` or a `Box` _owns_ some data strictly on the heap, but that data is not _part of_ (i.e. a field of) the `Vec` or `Box` value.
As a counter-example to your idea, it's theoretically possible for a type to have a `?Sized` field (at the end), although this idea was never completely fleshed out in the language. A value of such a type could be constructed on the stack.
Now in practice, if you encounter a type with an unsized type parameter, it's probably a smart pointer. It may have an ownership relation to some data which lives on the heap. That may be what you're referring to. But such heuristics are going to be more confusing than helpful for anyone who doesn't understand the basic premise. The location of data in rust is actually quite simple, but sometimes beginners make it more complicated than it really is somehow.