Anyway, whether a lifetime is late bound for a function item or not depends on if it appears in any where clauses. dyn Fn(..) and function pointer fn(..) types don't have where clauses. They either support all lifetimes modulo implied bounds, or support specific lifetimes. Lifetime elision in the arguments corresponds to the former, which one could call late bound I suppose. The more common terminology is that the type is higher-ranked.
It's not required; part of their special syntax is that you can elide higher-ranked lifetimes. dyn Fn(&str) and dyn for<'a> Fn(&'a str) are the same type; F: Fn(&str) and F: for<'a> Fn(&'a str) are the same bound.
That page does read a little odd on its own in my opinion, since it's starting from working code and trying to "desugar" it. And their other section on "desugaring" lifetimes in a function body
Is not a desugaring (it's non-compiing pseudo-syntax)
Is a totally different scenario than a trait bound
Is pretty misleading IMO as lifetimes don't correspond to lexical scopes[1]
But at any rate, the end conclusion (which is accurate) is that these do the same thing:
impl<F> Closure<F>
where F: Fn(&(u8, u16)) -> &u8,