What makes `impl Trait` as an argument “universal” and as a return value “existential”?
I was reading the RFC on "expanding" impl Trait when I came upon the following: By contrast, a programmer who first learned: fn take_iter(t: impl Iterator) and then tried: fn give_iter() -> impl Iterator would be successful, without any rigorous understanding that they just transitioned from a universal to an existential. While I understand universal vs existential from a logic perspective, what makes the first one above universal and the second one existential? Shepmaster The RFC defines the terms multiple times in multiple manners: between existential types (where the callee chooses the type