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?
question from:
https://stackoverflow.com/questions/65848837/how-are-trait-objects-handled-inside-const-functions 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…