Error code E0637

'_ lifetime name or &T without an explicit lifetime name has been used in an illegal place.

Erroneous code example:

#![allow(unused)]
fn main() {
fn underscore_lifetime<'_>(str1: &'_ str, str2: &'_ str) -> &'_ str {
                     //^^ `'_` is a reserved lifetime name
    if str1.len() > str2.len() {
        str1
    } else {
        str2
    }
}

fn without_explicit_lifetime<T>()
where
    T: Iterator<Item = &u32>,
                     //^ `&` without an explicit lifetime name
{
}

fn without_hrtb<T>()
where
    T: Into<&u32>,
          //^ `&` without an explicit lifetime name
{
}
}

First, '_ cannot be used as a lifetime identifier in some places because it is a reserved for the anonymous lifetime. Second, &T without an explicit lifetime name cannot also be used in some places. To fix them, use a lowercase letter such as 'a, or a series of lowercase letters such as 'foo. For more information about lifetime identifier, see the book. For more information on using the anonymous lifetime in Rust 2018, see the Rust 2018 blog post.

Corrected example:

#![allow(unused)]
fn main() {
fn underscore_lifetime<'a>(str1: &'a str, str2: &'a str) -> &'a str {
    if str1.len() > str2.len() {
        str1
    } else {
        str2
    }
}

fn without_explicit_lifetime<'a, T>()
where
    T: Iterator<Item = &'a u32>,
{
}

fn without_hrtb<T>()
where
    T: for<'foo> Into<&'foo u32>,
{
}
}