Почему для общего возвращаемого типа закрытия объекта в штучной упаковке требуется срок жизни? - PullRequest
3 голосов
/ 29 октября 2019

У меня проблема с компилятором, который жалуется, что 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_.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...