Function item types may or may not have lifetime parameters (i.e. early bound lifetimes); if they have the parameter, different lifetimes result in different types. If they don't, it's not parameterized by that lifetime; the lifetime is just part of it's Fn-trait implementations.
Try to turbofish test1 and you'll see it's not allowed (it doesn't have a lifetime parameter).
impl From<&str> for String {
fn from(s: &str) -> Self {
s.to_string()
}
}
// With less elision
impl<'a> From<&'a str> for String {
fn from(s: &'a str) -> Self {
s.to_string()
}
}
String can have these implementations without having a &str field or a lifetime parameter, no problem. It's the same idea with function item types and late-bound parameters, and their implementations of the Fn traits.