`] as a receiver.
## `Pin`
+r[lang-types.pin]
+
+r[lang-types.pin.receiver]
[Methods] can take [`Pin
`] as a receiver.
## `UnsafeCell`
+r[lang-types.unsafe-cell]
+
+r[lang-types.unsafe-cell.interior-mut]
[`std::cell::UnsafeCell`] is used for [interior mutability]. It ensures that
the compiler doesn't perform optimisations that are incorrect for such types.
+
+r[lang-types.unsafe-cell.read-only-alloc]
It also ensures that [`static` items] which have a type with interior
mutability aren't placed in memory marked as read only.
## `PhantomData`
+r[lang-types.phantom-data]
+
[`std::marker::PhantomData`] is a zero-sized, minimum alignment, type that
is considered to own a `T` for the purposes of [variance], [drop check], and
[auto traits](#auto-traits).
## Operator Traits
+r[lang-types.ops]
+
The traits in [`std::ops`] and [`std::cmp`] are used to overload [operators],
[indexing expressions], and [call expressions].
## `Deref` and `DerefMut`
+r[lang-types.deref]
+
As well as overloading the unary `*` operator, [`Deref`] and [`DerefMut`] are
also used in [method resolution] and [deref coercions].
## `Drop`
+r[lang-types.drop]
+
The [`Drop`] trait provides a [destructor], to be run whenever a value of this
type is to be destroyed.
## `Copy`
-The [`Copy`] trait changes the semantics of a type implementing it. Values
-whose type implements `Copy` are copied rather than moved upon assignment.
+r[lang-types.copy]
+r[lang-types.copy.intro]
+The [`Copy`] trait changes the semantics of a type implementing it.
+
+r[lang-types.copy.behavior]
+Values whose type implements `Copy` are copied rather than moved upon assignment.
+
+r[lang-types.copy.constraint]
`Copy` can only be implemented for types which do not implement `Drop`, and whose fields are all `Copy`.
For enums, this means all fields of all variants have to be `Copy`.
For unions, this means all variants have to be `Copy`.
+r[lang-types.copy.builtin-types]
`Copy` is implemented by the compiler for
+r[lang-types.copy.tuple]
* [Tuples] of `Copy` types
+
+r[lang-types.copy.fn-pointer]
* [Function pointers]
+
+r[lang-types.copy.fn-item]
* [Function items]
+
+r[lang-types.copy.closure]
* [Closures] that capture no values or that only capture values of `Copy` types
## `Clone`
+r[lang-types.clone]
+
+r[lang-types.clone.intro]
The [`Clone`] trait is a supertrait of `Copy`, so it also needs compiler
-generated implementations. It is implemented by the compiler for the following
-types:
+generated implementations.
+
+r[lang-types.clone.builtin-types]
+It is implemented by the compiler for the following types:
+r[lang-types.clone.builtin-copy]
* Types with a built-in `Copy` implementation (see above)
+
+r[lang-types.clone.tuple]
* [Tuples] of `Clone` types
+
+r[lang-types.clone.closure]
* [Closures] that only capture values of `Clone` types or capture no values from the environment
## `Send`
+r[lang-types.send]
+
The [`Send`] trait indicates that a value of this type is safe to send from one
thread to another.
## `Sync`
+r[lang-types.sync]
+
+r[lang-types.sync.intro]
The [`Sync`] trait indicates that a value of this type is safe to share between
-multiple threads. This trait must be implemented for all types used in
-immutable [`static` items].
+multiple threads.
+
+r[lang-types.sync.static-constraint]
+This trait must be implemented for all types used in immutable [`static` items].
## `Termination`
+r[lang-types.termination]
+
The [`Termination`] trait indicates the acceptable return types for the [main function] and [test functions].
## Auto traits
+r[lang-types.auto-traits]
+
The [`Send`], [`Sync`], [`Unpin`], [`UnwindSafe`], and [`RefUnwindSafe`] traits are _auto
traits_. Auto traits have special properties.
+r[lang-types.auto-traits.auto-impl]
If no explicit implementation or negative implementation is written out for an
auto trait for a given type, then the compiler implements it automatically
according to the following rules:
+r[lang-types.auto-traits.builtin-composite]
* `&T`, `&mut T`, `*const T`, `*mut T`, `[T; n]`, and `[T]` implement the trait
if `T` does.
+
+r[lang-types.auto-traits.fn-item-pointer]
* Function item types and function pointers automatically implement the trait.
+
+r[lang-types.auto-traits.aggregate]
* Structs, enums, unions, and tuples implement the trait if all of their fields
do.
+
+r[lang-types.auto-traits.closure]
* Closures implement the trait if the types of all of their captures do. A
closure that captures a `T` by shared reference and a `U` by value implements
any auto traits that both `&T` and `U` do.
+r[lang-types.auto-traits.generic-impl]
For generic types (counting the built-in types above as generic over `T`), if a
generic implementation is available, then the compiler does not automatically
implement it for types that could use the implementation except that they do not
@@ -122,6 +201,7 @@ meet the requisite trait bounds. For instance, the standard library implements
`Send` for all `&T` where `T` is `Sync`; this means that the compiler will not
implement `Send` for `&T` if `T` is `Send` but not `Sync`.
+r[lang-types.auto-traits.negative]
Auto traits can also have negative implementations, shown as `impl !AutoTrait
for T` in the standard library documentation, that override the automatic
implementations. For example `*mut T` has a negative implementation of `Send`,
@@ -129,15 +209,25 @@ and so `*mut T` is not `Send`, even if `T` is. There is currently no stable way
to specify additional negative implementations; they exist only in the standard
library.
+r[lang-types.auto-traits.trait-object-marker]
Auto traits may be added as an additional bound to any [trait object], even
though normally only one trait is allowed. For instance, `Box` is a valid type.
## `Sized`
+r[lang-types.sized]
+
+r[lang-types.sized.intro]
The [`Sized`] trait indicates that the size of this type is known at compile-time; that is, it's not a [dynamically sized type].
+
+r[lang-types.sized.implicit-sized]
[Type parameters] (except `Self` in traits) are `Sized` by default, as are [associated types].
+
+r[lang-types.sized.implicit-impl]
`Sized` is always implemented automatically by the compiler, not by [implementation items].
+
+r[lang-types.sized.relaxation]
These implicit `Sized` bounds may be relaxed by using the special `?Sized` bound.
[`Arc`]: std::sync::Arc