The following code segment gives me an error:
use std::rc::Rc;
// Definition of Cat, Dog, and Animal (see the last code block)
// ...
type RcAnimal = Rc<
There are actually plenty of types that can "not live long enough": all the ones that have a lifetime parameter.
If I were to introduce this type:
struct ShortLivedBee<'a>;
impl<'a> Animal for ShortLivedBee<'a> {}
ShortLivedBee is not valid for any lifetime, but only the ones that are valid for 'a as well.
So in your case with the bound
where T: Animal + 'static
the only ShortLivedBee I could feed into your function is ShortLivedBee<'static>.
What causes this is that when creating a Box, you are creating a trait object, which need to have an associated lifetime. If you do not specify it, it defaults to 'static. So the type you defined is actually:
type RcAnimal = Rc>;
That's why your function require that a 'static bound is added to T: It is not possible to store a ShortLivedBee<'a> in a Box unless 'a = 'static.
An other approach would be to add a lifetime annotation to your RcAnimal, like this:
type RcAnimal<'a> = Rc>;
And change your function to explicit the lifetime relations:
fn new_rc_animal<'a, T>(animal: T) -> RcAnimal<'a>
where T: Animal + 'a {
Rc::new(Box::new(animal) as Box)
}