Clean up E0746 explanation

This commit is contained in:
Guillaume Gomez 2020-08-05 14:14:21 +02:00
parent 3a92b9987a
commit cd4633917d

View file

@ -1,4 +1,4 @@
Return types cannot be `dyn Trait`s as they must be `Sized`.
An unboxed trait object was used as a return value.
Erroneous code example:
@ -13,11 +13,13 @@ impl T for S {
// Having the trait `T` as return type is invalid because
// unboxed trait objects do not have a statically known size:
fn foo() -> dyn T {
fn foo() -> dyn T { // error!
S(42)
}
```
Return types cannot be `dyn Trait`s as they must be `Sized`.
To avoid the error there are a couple of options.
If there is a single type involved, you can use [`impl Trait`]:
@ -32,7 +34,7 @@ If there is a single type involved, you can use [`impl Trait`]:
# }
// The compiler will select `S(usize)` as the materialized return type of this
// function, but callers will only know that the return type implements `T`.
fn foo() -> impl T {
fn foo() -> impl T { // ok!
S(42)
}
```
@ -57,7 +59,7 @@ impl T for O {
// This now returns a "trait object" and callers are only be able to access
// associated items from `T`.
fn foo(x: bool) -> Box<dyn T> {
fn foo(x: bool) -> Box<dyn T> { // ok!
if x {
Box::new(S(42))
} else {