I am looking for the answer why a sized trait is not object safe, for example:
trait Foo:Sized{}
Foo is not object safe.
I have read some posts about object safey, like object-safety and sizedness-in-rust. I find the deep reason is compiler automatically impl Foo for Foo
.
I confuse why compiler do this and why this cause Foo
not object safe?
Thank you very much.
impl Foo for Foo
is the way to write in Rust "implement trait Foo
for trait object Foo
". A trait can be only object-safe if the trait object for this trait implements the trait. Obviously, there is no much sense having a trait object, that does not implement itself.
By specifying trait Foo : Sized {}
, you require that all implementors of Foo
must also implement Sized
. But all trait objects in Rust are ?Sized
, meaning they can be unsized. Thus the trait object for type Foo : Sized
cannot implement Foo
, so you cannot write
impl Foo for Foo
or, in other words, the trait is not object safe.