我遇到编译器问题,如果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_
时。