about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-08-18 16:28:13 +0000
committerbors <bors@rust-lang.org>2015-08-18 16:28:13 +0000
commitdc9b74f38d2824d929660deabd5e78e39dcea2c5 (patch)
tree2a0eacfb8aa78052d9f358ddf1a3b279f15420a8 /src
parentc6291e04cc620ce3824d8bccdb8a5bd923fcd741 (diff)
parentce1bdc729338d723faf2de9410f890c5d00e5bf6 (diff)
Auto merge of #27536 - steveklabnik:doc_object_safety, r=alexcrichton
Fixes #26938
Diffstat (limited to 'src')
-rw-r--r--src/doc/trpl/trait-objects.md38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/doc/trpl/trait-objects.md b/src/doc/trpl/trait-objects.md
index f9dbc143c82..8127b0898c4 100644
--- a/src/doc/trpl/trait-objects.md
+++ b/src/doc/trpl/trait-objects.md
@@ -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.”