No se puede inferir una vida útil adecuada para un cierre que devuelve una referencia
Teniendo en cuenta el siguiente código:
fn foo<'a, T: 'a>(t: T) -> Box<Fn() -> &'a T + 'a> {
Box::new(move || &t)
}
Lo que espero
El tipo T tiene vida útil'a
.El valort
vivir tanto comoT
.t
se mueve hacia el cierre, de modo que el cierre viva mientrast
El cierre devuelve una referencia at
que fue trasladado al cierre. Por lo tanto, la referencia es válida mientras exista el cierre.No hay problema de por vida, el código se compila.Lo que realmente sucede:
El código no compila: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>
No entiendo el conflicto. ¿Cómo puedo arreglarlo?