How is "impl Display" different from "foo<T: Display>(x: T) -> T"?

Basically, it's just not done yet. RFC 2071 proposed adding a variant of impl Trait where you give the type an explicit name; it was accepted a whole eight months ago, but nobody has actually implemented it.

(On the other hand, if you use the existing impl Trait syntax rather than this proposed variant, I don't think there's any consensus on whether there should ever be a way to name that type, e.g. a typeof operator.)

For what it's worth, C++ has a similar problem with lambdas, which similarly have an unnameable type and cannot be stored in a struct without making the struct generic.