, но ничто в этой подписи не помешает этому.
вая следующий код:
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>
Я не понимаю конфликта. Как я могу это исправить?