pub trait Copy: Clone { }Expand description
Types whose values can be duplicated simply by copying bits.
By default, variable bindings have ‘move semantics.’ In other words:
#[derive(Debug)]
struct Foo;
let x = Foo;
let y = x;
// `x` has moved into `y`, and so cannot be used
// println!("{x:?}"); // error: use of moved valueRunHowever, if a type implements Copy, it instead has ‘copy semantics’:
// We can derive a `Copy` implementation. `Clone` is also required, as it's
// a supertrait of `Copy`.
#[derive(Debug, Copy, Clone)]
struct Foo;
let x = Foo;
let y = x;
// `y` is a copy of `x`
println!("{x:?}"); // A-OK!RunIt’s important to note that in these two examples, the only difference is whether you
are allowed to access x after the assignment. Under the hood, both a copy and a move
can result in bits being copied in memory, although this is sometimes optimized away.
How can I implement Copy?
There are two ways to implement Copy on your type. The simplest is to use derive:
#[derive(Copy, Clone)]
struct MyStruct;RunYou can also implement Copy and Clone manually:
struct MyStruct;
impl Copy for MyStruct { }
impl Clone for MyStruct {
fn clone(&self) -> MyStruct {
*self
}
}RunThere is a small difference between the two: the derive strategy will also place a Copy
bound on type parameters, which isn’t always desired.
What’s the difference between Copy and Clone?
Copies happen implicitly, for example as part of an assignment y = x. The behavior of
Copy is not overloadable; it is always a simple bit-wise copy.
Cloning is an explicit action, x.clone(). The implementation of Clone can
provide any type-specific behavior necessary to duplicate values safely. For example,
the implementation of Clone for String needs to copy the pointed-to string
buffer in the heap. A simple bitwise copy of String values would merely copy the
pointer, leading to a double free down the line. For this reason, String is Clone
but not Copy.
Clone is a supertrait of Copy, so everything which is Copy must also implement
Clone. If a type is Copy then its Clone implementation only needs to return *self
(see the example above).
When can my type be Copy?
A type can implement Copy if all of its components implement Copy. For example, this
struct can be Copy:
#[derive(Copy, Clone)]
struct Point {
x: i32,
y: i32,
}RunA struct can be Copy, and i32 is Copy, therefore Point is eligible to be Copy.
By contrast, consider
struct PointList {
points: Vec<Point>,
}RunThe struct PointList cannot implement Copy, because Vec<T> is not Copy. If we
attempt to derive a Copy implementation, we’ll get an error:
the trait `Copy` may not be implemented for this type; field `points` does not implement `Copy`Shared references (&T) are also Copy, so a type can be Copy, even when it holds
shared references of types T that are not Copy. Consider the following struct,
which can implement Copy, because it only holds a shared reference to our non-Copy
type PointList from above:
#[derive(Copy, Clone)]
struct PointListWrapper<'a> {
point_list_ref: &'a PointList,
}RunWhen can’t my type be Copy?
Some types can’t be copied safely. For example, copying &mut T would create an aliased
mutable reference. Copying String would duplicate responsibility for managing the
String’s buffer, leading to a double free.
Generalizing the latter case, any type implementing Drop can’t be Copy, because it’s
managing some resource besides its own size_of::<T> bytes.
If you try to implement Copy on a struct or enum containing non-Copy data, you will get
the error E0204.
When should my type be Copy?
Generally speaking, if your type can implement Copy, it should. Keep in mind, though,
that implementing Copy is part of the public API of your type. If the type might become
non-Copy in the future, it could be prudent to omit the Copy implementation now, to
avoid a breaking API change.
Additional implementors
In addition to the implementors listed below,
the following types also implement Copy:
- Function item types (i.e., the distinct types defined for each function)
- Function pointer types (e.g.,
fn() -> i32) - Tuple types, if each component also implements
Copy(e.g.,(),(i32, bool)) - Closure types, if they capture no value from the environment
or if all such captured values implement
Copythemselves. Note that variables captured by shared reference always implementCopy(even if the referent doesn’t), while variables captured by mutable reference never implementCopy.
Implementations on Foreign Types
impl Copy for __m512
sourceimpl Copy for CpuidResult
1.27.0 · sourceimpl Copy for __m512bh
sourceimpl Copy for __m128i
1.27.0 · sourceimpl Copy for __m256bh
sourceimpl Copy for __m512d
sourceimpl Copy for __m128
1.27.0 · sourceimpl Copy for __m256i
1.27.0 · sourceimpl Copy for __m512i
sourceimpl Copy for __m128bh
sourceimpl Copy for __m128d
1.27.0 · sourceimpl Copy for __m256d
1.27.0 · sourceimpl Copy for __m256
1.27.0 · sourceImplementors
impl Copy for std::cmp::Ordering
sourceimpl Copy for Infallible
1.34.0 · sourceimpl Copy for ErrorKind
sourceimpl Copy for SeekFrom
sourceimpl Copy for IpAddr
1.7.0 · sourceimpl Copy for Ipv6MulticastScope
sourceimpl Copy for Shutdown
sourceimpl Copy for SocketAddr
sourceimpl Copy for FpCategory
sourceimpl Copy for BacktraceStyle
sourceimpl Copy for Which
sourceimpl Copy for SearchStep
sourceimpl Copy for std::sync::atomic::Ordering
sourceimpl Copy for RecvTimeoutError
1.12.0 · sourceimpl Copy for TryRecvError
sourceimpl Copy for bool
sourceimpl Copy for char
sourceimpl Copy for f32
sourceimpl Copy for f64
sourceimpl Copy for i8
sourceimpl Copy for i16
sourceimpl Copy for i32
sourceimpl Copy for i64
sourceimpl Copy for i128
sourceimpl Copy for isize
sourceimpl Copy for !
sourceimpl Copy for u8
sourceimpl Copy for u16
sourceimpl Copy for u32
sourceimpl Copy for u64
sourceimpl Copy for u128
sourceimpl Copy for usize
sourceimpl Copy for AllocError
sourceimpl Copy for Global
sourceimpl Copy for Layout
1.28.0 · sourceimpl Copy for System
1.28.0 · sourceimpl Copy for TypeId
sourceimpl Copy for TryFromSliceError
1.34.0 · sourceimpl Copy for CharTryFromError
1.34.0 · sourceimpl Copy for TryFromCharError
1.59.0 · sourceimpl Copy for Error
sourceimpl Copy for FileType
1.1.0 · sourceimpl Copy for Empty
sourceimpl Copy for Sink
sourceimpl Copy for Ipv4Addr
sourceimpl Copy for Ipv6Addr
sourceimpl Copy for SocketAddrV4
sourceimpl Copy for SocketAddrV6
sourceimpl Copy for NonZeroI8
1.34.0 · sourceimpl Copy for NonZeroI16
1.34.0 · sourceimpl Copy for NonZeroI32
1.34.0 · sourceimpl Copy for NonZeroI64
1.34.0 · sourceimpl Copy for NonZeroI128
1.34.0 · sourceimpl Copy for NonZeroIsize
1.34.0 · sourceimpl Copy for NonZeroU8
1.28.0 · sourceimpl Copy for NonZeroU16
1.28.0 · sourceimpl Copy for NonZeroU32
1.28.0 · sourceimpl Copy for NonZeroU64
1.28.0 · sourceimpl Copy for NonZeroU128
1.28.0 · sourceimpl Copy for NonZeroUsize
1.28.0 · sourceimpl Copy for TryFromIntError
1.34.0 · sourceimpl Copy for RangeFull
sourceimpl Copy for UCred
sourceimpl Copy for ExitCode
1.61.0 · sourceimpl Copy for ExitStatus
sourceimpl Copy for ExitStatusError
sourceimpl Copy for Utf8Error
sourceimpl Copy for RecvError
sourceimpl Copy for WaitTimeoutResult
1.5.0 · sourceimpl Copy for RawWakerVTable
1.36.0 · sourceimpl Copy for AccessError
1.26.0 · sourceimpl Copy for ThreadId
1.19.0 · sourceimpl Copy for Duration
1.3.0 · sourceimpl Copy for Instant
1.8.0 · sourceimpl Copy for SystemTime
1.8.0 · sourceimpl Copy for PhantomPinned
1.33.0 · sourceimpl<'_, T> Copy for &'_ T where
T: ?Sized,
sourceShared references can be copied, but mutable references cannot!