Auto merge of #27536 - steveklabnik:doc_object_safety, r=alexcrichton
Fixes #26938
This commit is contained in:
commit
dc9b74f38d
@ -300,3 +300,41 @@ let y = TraitObject {
|
||||
// y.method();
|
||||
(y.vtable.method)(y.data);
|
||||
```
|
||||
|
||||
## Object Safety
|
||||
|
||||
Not every trait can be used to make a trait object. For example, vectors implement
|
||||
`Clone`, but if we try to make a trait object:
|
||||
|
||||
```ignore
|
||||
let v = vec![1, 2, 3];
|
||||
let o = &v as &Clone;
|
||||
```
|
||||
|
||||
We get an error:
|
||||
|
||||
```text
|
||||
error: cannot convert to a trait object because trait `core::clone::Clone` is not object-safe [E0038]
|
||||
let o = &v as &Clone;
|
||||
^~
|
||||
note: the trait cannot require that `Self : Sized`
|
||||
let o = &v as &Clone;
|
||||
^~
|
||||
```
|
||||
|
||||
The error says that `Clone` is not ‘object-safe’. Only traits that are
|
||||
object-safe can be made into trait objects. A trait is object-safe if both of
|
||||
these are true:
|
||||
|
||||
* the trait does not require that `Self: Sized`
|
||||
* all of its methods are object-safe
|
||||
|
||||
So what makes a method object-safe? Each method must require that `Self: Sized`
|
||||
or all of the following:
|
||||
|
||||
* must not have any type parameters
|
||||
* must not use `Self`
|
||||
|
||||
Whew! As we can see, almost all of these rules talk about `Self`. A good intuition
|
||||
is “except in special circumstances, if your trait’s method uses `Self`, it is not
|
||||
object-safe.”
|
||||
|
Loading…
x
Reference in New Issue
Block a user