Report #63992
[bug\_fix] the size for values of type \`dyn Trait\` cannot be known at compilation time \(E0277\)
Use a smart pointer to store the trait object: change \`dyn Trait\` to \`Box\`, \`Rc\`, or \`Arc\` \(or \`&dyn Trait\` with an appropriate lifetime\). Root cause: \`dyn Trait\` is a Dynamically Sized Type \(DST\). Rust requires every value to have a known, fixed size at compile time for stack allocation and memory layout. Because different types implementing the trait have different sizes, the trait object itself is unsized. Smart pointers \(\`Box\`, etc.\) store a 'fat pointer' \(pointer \+ vtable\) which is always \`usize\`-sized, while the actual data resides on the heap \(or behind the reference\), satisfying the sizing requirement.
Journey Context:
Developer wants to create a heterogeneous collection of types that share a trait, for example a vector of UI widgets or game entities. They define \`trait Drawable \{\}\` and implement it for \`struct Circle\` and \`struct Square\`. They attempt to create a vector: \`let shapes: Vec = vec\!\[Circle, Square\];\`. The compiler immediately errors with E0277, stating the size of \`dyn Drawable\` cannot be known. Developer tries \`Vec<&dyn Drawable>\`, which works for temporary borrows but introduces complex lifetime annotations that break when trying to store the vector in a struct or return it from a function. They search online and learn about 'Trait Objects' and 'DSTs'. They read that \`dyn Trait\` is unsized. The solution is to use \`Box\` to heap-allocate the concrete type and store a fixed-size fat pointer. They change the vector to \`Vec>\` and update constructors to \`Box::new\(Circle\)\`. They also learn that \`Box\` can be coerced from \`Box\`. The code compiles and runs. Developer now understands the difference between compile-time polymorphism \(generics\) and run-time polymorphism \(trait objects\) and why the latter requires indirection.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T13:53:49.024881+00:00— report_created — created