How are trait objects handled inside const functions?

Viewed 397

I was trying to create an uninitialized boxed trait object wrapped inside a MaybeUninit.

trait Foo {}

const fn test() {
    // Error!
    let _bar: MaybeUninit<Box<dyn Foo>> = MaybeUninit::uninit();
}

playground link

The compiler gives me the following error.

error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable

I don't understand why the compiler talks about trait bounds as my function does not have any generic parameter.

I found a way around, just by wrapping the Box<dyn Foo> into another structure.

trait Foo {}

struct BoxedFoo(Box<dyn Foo>);

const fn test() {
    // It works!
    let _bar: MaybeUninit<BoxedFoo> = MaybeUninit::uninit();
}

And it works.

Why does wrapping the box makes any difference? How does first case has to do with trait bounds but not the second one?

0 Answers
Related