Certain types and traits that exist in the standard library are known to the Rust compiler. This chapter documents the special features of these types and traits.
Box<T> has a few special features that Rust doesn't currently allow for user defined types.
Box<T>produces a place which can be moved from. This means that the
*operator and the destructor of
Box<T>are built-in to the language.
Box<Self>as a receiver.
Box<T>in the same crate as
T, which the orphan rules prevent for other generic types.
std::cell::UnsafeCell<T> is used for interior mutability. It ensures that the compiler doesn't perform optimisations that are incorrect for such types. It also ensures that
static items which have a type with interior mutability aren't placed in memory marked as read only.
Copy trait changes the semantics of a type implementing it. Values whose type implements
Copy are copied rather than moved upon assignment.
Copy cannot be implemented for types which implement
Drop, or which have fields that are not
Copy is implemented by the compiler for
Clone trait is a supertrait of
Copy, so it also needs compiler generated implementations. It is implemented by the compiler for the following types:
Send trait indicates that a value of this type is safe to send from one thread to another.
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:
[T]implement the trait if
Tby shared reference and a
Uby value implements any auto traits that both
For generic types (counting the built-in types above as generic over
T), if an generic implementation is available, then the compiler does not automatically implement it for types that could use the implementation except that they do not meet the requisite trait bounds. For instance, the standard library implements
Send for all
Sync; this means that the compiler will not implement
Send but not
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, 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.
Auto traits may be added as an additional bound to any trait object, even though normally only one trait is allowed. For instance,
Box<dyn Debug + Send + UnwindSafe> is a valid type.
Sized trait indicates that the size of this type is known at compile-time; that is, it's not a dynamically sized type. Type parameters are
Sized by default.
Sized is always implemented automatically by the compiler, not by implementation items.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.