, но ничто в этой подписи не помешает этому.

вая следующий код:

fn foo<'a, T: 'a>(t: T) -> Box<Fn() -> &'a T + 'a> {
    Box::new(move || &t)
}

Что я ожидаю:

Тип Т имеет время жизни'a.Значениеt жить так долгоT.t перемещается к закрытию, поэтому закрытие живет до тех пор, покаtЗакрытие возвращает ссылку наt который был перенесен в закрытие. Таким образом, ссылка действительна, пока существует закрытие.Нет проблем на всю жизнь, код компилируется.

Что на самом деле происходит:

Код не компилируется:
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
 --> src/lib.rs:2:22
  |
2 |     Box::new(move || &t)
  |                      ^^
  |
note: first, the lifetime cannot outlive the lifetime  as defined on the body at 2:14...
 --> src/lib.rs:2:14
  |
2 |     Box::new(move || &t)
  |              ^^^^^^^^^^
note: ...so that closure can access `t`
 --> src/lib.rs:2:22
  |
2 |     Box::new(move || &t)
  |                      ^^
note: but, the lifetime must be valid for the lifetime 'a as defined on the function body at 1:8...
 --> src/lib.rs:1:8
  |
1 | fn foo<'a, T: 'a>(t: T) -> Box<Fn() -> &'a T + 'a> {
  |        ^^
  = note: ...so that the expression is assignable:
          expected std::boxed::Box<(dyn std::ops::Fn() -> &'a T + 'a)>
             found std::boxed::Box<dyn std::ops::Fn() -> &T>

Я не понимаю конфликта. Как я могу это исправить?

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

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