Trait Copy
trait Copy: Clone
Types whose values can be duplicated simply by copying bits.
By default, variable bindings have 'move semantics.' In other words:
;
let x = Foo;
let y = x;
// `x` has moved into `y`, and so cannot be used
// println!("{x:?}"); // error: use of moved value
However, 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`.
;
let x = Foo;
let y = x;
// `y` is a copy of `x`
println!; // A-OK!
It'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:
;
You can also implement Copy and Clone manually:
;
There is a small difference between the two. The derive strategy will also place a Copy
bound on type parameters:
;
This isn't always desired. For example, shared references (&T) can be copied regardless of
whether T is Copy. Likewise, a generic struct containing markers such as PhantomData
could potentially be duplicated with a bit-wise copy.
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:
#
A struct can be Copy, and i32 is Copy, therefore Point is eligible to be Copy.
By contrast, consider
#
# ;
The 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` cannot 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:
#
# ;
When 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) - 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.
Implementors
impl Copy for AllocErrorimpl Copy for uint32x4x3_timpl Copy for m256iimpl Copy for u16impl Copy for poly16x4_timpl Copy for float16x8x3_timpl Copy for vector_signed_charimpl Copy for Localityimpl Copy for i16impl Copy for poly64x1_timpl Copy for float32x4x3_timpl Copy for vector_signed_intimpl<T> Copy for PhantomContravariant<T>impl Copy for f64impl Copy for poly16x8_timpl Copy for int64x2x3_timpl Copy for vector_floatimpl Copy for neverimpl Copy for poly64x2_timpl Copy for uint64x2x3_timpl Copy for HvxVectorPairimpl<T> Copy for Discriminant<T>impl Copy for RangeFullimpl Copy for int8x16x2_timpl Copy for poly64x2x3_timpl<T: Copy, N: usize> Copy for [T; N]impl Copy for uint8x16x2_timpl Copy for __m256impl<T> Copy for PhantomInvariant<T>impl<F: $crate::marker::Copy> Copy for RepeatWith<F>impl Copy for poly8x16x2_timpl Copy for __m256bhimpl Copy for SocketAddrV4impl Copy for int16x8x2_timpl Copy for CpuidResultimpl<T: $crate::marker::Copy + ?Sized> Copy for ManuallyDrop<T>impl<Idx: $crate::marker::Copy> Copy for RangeInclusive<Idx>impl Copy for uint16x8x2_timpl Copy for float64x2x2_timpl Copy for Alignmentimpl Copy for poly16x8x2_timpl Copy for vector_bool_charimpl Copy for Utf8Errorimpl Copy for int32x4x2_timpl Copy for vector_bool_intimpl Copy for Layoutimpl Copy for uint32x4x2_timpl Copy for f16x2impl Copy for u8impl Copy for uint16x4_timpl Copy for float16x8x2_timpl Copy for m128dimpl Copy for i8impl Copy for uint64x1_timpl Copy for float32x4x2_timpl Copy for vector_bool_shortimpl Copy for f32impl Copy for uint16x8_timpl Copy for int64x2x2_timpl Copy for vector_bool_long_longimpl<T: PointeeSized> Copy for *mut Timpl Copy for uint64x2_timpl Copy for uint64x2x2_timpl Copy for HvxVectorimpl<Y: $crate::marker::Copy, R: $crate::marker::Copy> Copy for CoroutineState<Y, R>impl Copy for int8x8x4_timpl Copy for poly64x2x2_timpl Copy for TryFromSliceErrorimpl Copy for uint8x8x4_timpl Copy for __m256iimpl Copy for FromBytesWithNulErrorimpl Copy for poly8x8x4_timpl Copy for __m128bhimpl<T: $crate::marker::Copy> Copy for Saturating<T>impl Copy for SocketAddrimpl Copy for int16x4x4_timpl Copy for bf16impl<Idx: $crate::marker::Copy> Copy for Range<Idx>impl Copy for uint16x4x4_timpl Copy for float64x1x4_timpl<T> Copy for Exclusive<T>impl Copy for poly16x4x4_timpl Copy for vector_unsigned_charimpl<'a> Copy for Arguments<'a>impl Copy for int32x2x4_timpl Copy for vector_unsigned_intimpl Copy for RawWakerVTableimpl Copy for uint32x2x4_timpl Copy for vector_doubleimpl<Dyn: PointeeSized> Copy for DynMetadata<Dyn>impl Copy for usizeimpl Copy for int16x4_timpl Copy for float16x4x4_timpl Copy for m128impl Copy for isizeimpl Copy for int64x1_timpl Copy for float32x2x4_timpl Copy for vector_unsigned_shortimpl Copy for f16impl Copy for int16x8_timpl Copy for int64x1x4_timpl Copy for vector_unsigned_long_longimpl<T: PointeeSized> Copy for *const Timpl Copy for int64x2_timpl Copy for uint64x1x4_timpl Copy for HvxVectorPredimpl<B: $crate::marker::Copy, C: $crate::marker::Copy> Copy for ControlFlow<B, C>impl Copy for int8x8x3_timpl Copy for poly64x1x4_timpl Copy for TypeIdimpl Copy for uint8x8x3_timpl<T: $crate::marker::Copy> Copy for Wrapping<T>impl Copy for __m128dimpl Copy for CharCaseimpl Copy for poly8x8x3_timpl Copy for __m512dimpl Copy for TryFromIntErrorimpl Copy for Ipv6MulticastScopeimpl Copy for int16x4x3_timpl Copy for __m512himpl Copy for IntErrorKindimpl<Ptr: $crate::marker::Copy> Copy for Pin<Ptr>impl Copy for uint16x4x3_timpl Copy for float64x1x3_timpl Copy for Orderingimpl Copy for poly16x4x3_timpl Copy for vector_signed_charimpl Copy for FormattingOptionsimpl Copy for int32x2x3_timpl Copy for vector_signed_intimpl<T: $crate::marker::Copy> Copy for Poll<T>impl Copy for uint32x2x3_timpl Copy for vector_bool_longimpl Copy for poly8x8_timpl Copy for float16x4x3_timpl Copy for m128iimpl Copy for u128impl Copy for float32x2_timpl Copy for float32x2x3_timpl Copy for vector_signed_shortimpl Copy for i128impl Copy for poly8x16_timpl Copy for int64x1x3_timpl Copy for vector_signed_long_longimpl Copy for charimpl Copy for float32x4_timpl Copy for uint64x1x3_timpl Copy for HvxVectorPairimpl Copy for PhantomPinnedimpl Copy for int8x8x2_timpl Copy for poly64x1x3_timpl<T, N: usize> Copy for Simd<T, N>impl<T: $crate::marker::Copy> Copy for Bound<T>impl Copy for uint8x8x2_timpl Copy for __m128impl Copy for FpCategoryimpl<'a> Copy for PhantomInvariantLifetime<'a>impl<T: PointeeSized> Copy for NonNull<T>impl Copy for TryFromCharErrorimpl Copy for poly8x8x2_timpl Copy for __m512impl Copy for Ipv6Addrimpl Copy for int16x4x2_timpl Copy for __m256himpl<'a> Copy for Location<'a>impl Copy for uint16x4x2_timpl Copy for float64x1x2_timpl<T: $crate::marker::Copy, E: $crate::marker::Copy> Copy for Result<T, E>impl Copy for poly16x4x2_timpl Copy for v128impl Copy for DebugAsHeximpl Copy for Infallibleimpl Copy for int32x2x2_timpl Copy for vector_bool_shortimpl Copy for Durationimpl Copy for uint32x2x2_timpl Copy for vector_unsigned_longimpl<T> Copy for NonZero<T>impl Copy for uint8x8_timpl Copy for float16x4x2_timpl Copy for m256dimpl Copy for u64impl Copy for uint32x2_timpl Copy for float32x2x2_timpl Copy for vector_bool_charimpl<'a> Copy for PhantomContravariantLifetime<'a>impl Copy for i64impl Copy for uint8x16_timpl Copy for int64x1x2_timpl Copy for vector_bool_intimpl Copy for boolimpl Copy for uint32x4_timpl Copy for uint64x1x2_timpl Copy for HvxVectorimpl<T: PointeeSized> Copy for PhantomData<T>impl Copy for float16x8_timpl Copy for poly64x1x2_timpl<T, N: usize> Copy for Mask<T, N>impl<Idx: $crate::marker::Copy> Copy for RangeToInclusive<Idx>impl Copy for int8x16x4_timpl Copy for __m128iimpl Copy for CharTryFromErrorimpl Copy for uint8x16x4_timpl Copy for __m512iimpl Copy for Ipv4Addrimpl Copy for poly8x16x4_timpl Copy for __m128himpl<T: $crate::marker::Copy> Copy for Option<T>impl Copy for int16x8x4_timpl Copy for float64x2_timpl<Idx: $crate::marker::Copy> Copy for RangeToInclusive<Idx>impl Copy for Assumeimpl Copy for uint16x8x4_timpl Copy for float64x2x4_timpl Copy for Signimpl Copy for poly16x8x4_timpl Copy for vector_unsigned_shortimpl Copy for SearchStepimpl Copy for int32x4x4_timpl Copy for vector_signed_longimpl Copy for Orderingimpl Copy for int8x8_timpl Copy for uint32x4x4_timpl Copy for m256impl Copy for Alignmentimpl Copy for u32impl Copy for int32x2_timpl Copy for float16x8x4_timpl Copy for vector_unsigned_charimpl Copy for i32impl<P: $crate::marker::Copy + ?Sized> Copy for MaybeDangling<P>impl Copy for int8x16_timpl Copy for float32x4x4_timpl Copy for vector_unsigned_intimpl Copy for f128impl Copy for int32x4_timpl Copy for int64x2x4_timpl Copy for vector_doubleimpl<T: $crate::marker::Copy> Copy for Reverse<T>impl<T: PointeeSized> Copy for &Timpl Copy for float16x4_timpl Copy for uint64x2x4_timpl Copy for HvxVectorPredimpl<Idx: $crate::marker::Copy> Copy for RangeTo<Idx>impl Copy for int8x16x3_timpl Copy for poly64x2x4_timpl Copy for AsciiCharimpl Copy for uint8x16x3_timpl Copy for __m256dimpl<T: $crate::marker::Copy> Copy for MaybeUninit<T>impl Copy for IpAddrimpl Copy for poly8x16x3_timpl Copy for __m512bhimpl<T: ?Sized, VARIANT: u32, FIELD: u32> Copy for FieldRepresentingType<T, VARIANT, FIELD>impl Copy for SocketAddrV6impl Copy for int16x8x3_timpl Copy for float64x1_timpl<Idx: $crate::marker::Copy> Copy for RangeFrom<Idx>impl Copy for uint16x8x3_timpl Copy for float64x2x3_timpl<'a> Copy for PhantomCovariantLifetime<'a>impl Copy for Errorimpl Copy for poly16x8x3_timpl Copy for vector_signed_shortimpl<T> Copy for PhantomCovariant<T>impl<'a> Copy for Utf8Pattern<'a>impl Copy for int32x4x3_timpl Copy for vector_float