为什么在装箱特征对象闭包的通用返回类型上需要生存期限制?

时间:2019-10-29 19:42:03

标签: generics rust traits lifetime box

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

0 个答案:

没有答案