У меня проблема с компилятором, который жалуется, что Box<dyn 'f + FnMut(A)>
не реализует 'f + FnMut(A)
, если A
не привязан к времени жизни 't
. Я сократил его до этого минимального примера, где FnMut(A)
заменяется на Foo<A>
:
trait Foo<A> {}
impl<'a, A> Foo<A> for &'a () {}
impl<'a, A> Foo<A> for Box<dyn 'a + Foo<A>> {}
fn through_box<'a, A>(x: &'a ()) -> impl 'a + Foo<A>
where
//A: 'static,
{
let box_: Box<dyn 'a + Foo<A>> = Box::new(x);
box_
}
error[E0309]: the parameter type `A` may not live long enough
--> src/main.rs:5:37
|
5 | fn through_box<'a, A>(x: &'a ()) -> impl 'a + Foo<A>
| - ^^^^^^^^^^^^^^^^
| |
| help: consider adding an explicit lifetime bound `A: 'a`...
|
note: ...so that the type `std::boxed::Box<dyn Foo<A>>` will meet its required lifetime bounds
--> src/main.rs:5:37
|
5 | fn through_box<'a, A>(x: &'a ()) -> impl 'a + Foo<A>
| ^^^^^^^^^^^^^^^^
Это не компилируется, в то время как это происходит, раскомментируя ограничение времени жизни для A
.
Также компилируется следующее:
trait Foo {}
impl<'a> Foo for &'a () {}
impl<'a> Foo for Box<dyn 'a + Foo> {}
fn through_box<'a>(x: &'a ()) -> impl 'a + Foo {
let box_: Box<dyn 'a + Foo> = Box::new(x);
box_
}
Я не понимаю, почему первая программа требует ограничения на A
.
Обратите внимание, что моя проблема не заключается вфункция в Box<dyn 'a + Foo<A>>
, которая работает, но тот факт, что этот Box<dyn 'a + Foo<A>>
, по-видимому, сам по себе не имеет времени жизни 'a
, следовательно, ошибка в типе возврата и не при инициализации box_
.