Время жизни и параметр типа "impl Type"

Здравствуйте.
В продолжение моей темы
Вот на такой код

struct BoxedParser {
    parser: Box<dyn Parser>,
}

impl BoxedParser {
    fn new(p: impl Parser) -> Self {
        Self {
            parser: Box::new(p),
        }
    }
}

impl Parser for BoxedParser {
    fn parse<'a>(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
        self.parser.parse(in_string)
    }
}

rust ругается так

error[E0310]: the parameter type `impl Parser` may not live long enough
  --> src/xml_formater.rs:37:21
   |
37 |             parser: Box::new(p),
   |                     ^^^^^^^^^^^
   |

При чём тут время жизни вообще? Я ведь передаю p во владение BoxedParser, а не ссылку!

p у Вас это impl Parser, то есть неявный дженерик. Если бы был явным, то это было бы fn new<P: Parser>(p: P) -> Self. Соответственно, так как p - это любой тип, то он может быть и ссылкой и любым другим reference-типом, который содержит в себе лайфтаймы. А Box<dyn Parser> - это на самом деле сокращенное от Box<dyn Parser + 'static>. Потому и не сходится. Попробуйте fn new(p: impl Parser + 'static) -> Self

Это же вообще, по-моему, не generic. Он может им быть, а может и нет. Для функции это всё равно, лишь бы реализовывался трейт Parser.

Хм… т.е. rust выводит времена жизни только из сигнатур? Реально не проверяется что там в коде конкретного типа, который передаётся в функцию?

Да, так конкретно эта ситуация решается, но дальше по коду другие ошибки. Не помню уже точно, я с десяток вариантов уже перебрал (

Нет, всё-таки дженерик )

Да, весь лайф-тайм чекинг локальный.