В чем разница между & dyn Trait и Box ‹dyn Trait› для динамической отправки?

Функции new_foo1 и new_foo2 возвращают одну и ту же черту Foo с использованием разных шаблонов. Я не вижу между ними какой-либо функциональной разницы, кроме того, что new_foo1 они более подробны. Есть ли среди этих двух предпочтительный способ? Есть ли какие-нибудь тонкие ответвления у любого из этих паттернов?

trait Foo {
    fn bar(&self);
}

struct FooIm {}

impl Foo for FooIm {
    fn bar(&self) {
        println!("bar from FooIm")
    }
}

fn new_foo1<'a>() -> &'a (dyn Foo + 'a) {
    &FooIm {}
}

fn new_foo2() -> Box<dyn Foo> {
    let f = FooIm {};
    Box::new(f)
}

fn main() {
    let f1 = new_foo1();
    let f2 = new_foo2();

    f1.bar();
    f2.bar();
}

person Aleksey Kanaev    schedule 22.09.2020    source источник
comment
Я вижу сейчас. Но зачем вообще существует new_foo1, если он такой слабый?   -  person Aleksey Kanaev    schedule 22.09.2020
comment
@AlekseyKanaev Передача ящиков передает право собственности. Вам часто нужно передавать ссылки, не отказываясь от владения. Это совершенно не связано с объектами-признаками.   -  person Sven Marnach    schedule 22.09.2020
comment
Конструктор всегда должен возвращать принадлежащий ему объект, поэтому в этом случае возвращение ссылки действительно не имеет никакого смысла.   -  person Sven Marnach    schedule 22.09.2020