3

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?

Gymore
  • 585
  • 2
  • 10
  • 2
    The compiler team is very conservative about what is allowed in `const`s at the moment, and they have chosen to forbid `?Sized` bounds. A `dyn Trait` is always un-`Sized`, so that's where you warning comes from. However since a `Box` is `Sized` and the new-type trick is enough to make the compiler happy, I would just categorize that as a diagnostic issue. – mcarton Jan 22 '21 at 17:32

0 Answers0