Признак с более высоким рангом Вопрос о пожизненном переплете

Я пытаюсь написать функцию, возвращающую закрытие в штучной упаковке, которая может работать со ссылками на типы с любым временем жизни. При написании конкретного экземпляра все работает нормально. Но когда я пишу общую версию, я сталкиваюсь с проблемами на всю жизнь.

struct Parameter<'a> {
    s: &'a str,
}

fn main() {
    let closure = generate_closure_gen();
    let string = String::from("Hello World!");
    let parameter = Parameter { s: &string }; // Error: string does not live long enough
    closure(&parameter);
}

// This one works fine
// Desugared version for Box<Fn(&Parameter)>
fn generate_closure() -> Box<for <'a, 'r> Fn(&'r Parameter<'a>)> {
    Box::new(|c: &Parameter| {})
}

// This one gives lifetime errors
fn generate_closure_gen<C>() -> Box<Fn(&C)> {
    Box::new(|c: &C| {})
}

Я не понимаю, почему замыканию нужен параметр типа, чтобы жить дольше, чем он (нет хранилища или чего-то еще ...). И он работает для неуниверсальной версии с HRTB, просто кажется, что должна быть возможность заставить его работать с универсальной версией.
Кроме того, если я пытаюсь написать конкретную версию, используя общую версию, я получаю ошибку типа

// Desugared version for Box<Fn(&Parameter)>
fn generate_closure_2() -> Box<for <'a, 'r> Fn(&'r Parameter<'a>)> {
    generate_closure_gen()
}

src/main.rs:22:5: 22:27 error: mismatched types:
 expected `Box<for<'r, 'r> core::ops::Fn(&'r Parameter<'r>) + 'static>`,
    found `Box<for<'r> core::ops::Fn(&'r _) + 'static>`
(expected concrete lifetime,
    found bound lifetime parameter ) [E0308]
src/main.rs:22     generate_closure_gen()
                   ^~~~~~~~~~~~~~~~~~~~~~
src/main.rs:22:5: 22:27 help: run `rustc --explain E0308` to see a detailed explanation

Есть идеи, как заставить это работать?

(ссылка на манеж)

Ответы на вопрос(1)

Ваш ответ на вопрос