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 int64x1x2_timpl Copy for vector_floatimpl<F: $crate::marker::Copy> Copy for RepeatWith<F>impl Copy for float32x4_timpl Copy for uint32x4x4_timpl Copy for float64x2x2_timpl<B: $crate::marker::Copy, C: $crate::marker::Copy> Copy for ControlFlow<B, C>impl Copy for uint32x2_timpl Copy for Assumeimpl Copy for poly16x8x3_timpl Copy for __m128bhimpl Copy for i128impl<T, N: usize> Copy for Simd<T, N>impl Copy for SearchStepimpl Copy for int16x8x2_timpl Copy for poly64x1x4_timpl Copy for vector_bool_charimpl<Idx: $crate::marker::Copy> Copy for RangeToInclusive<Idx>impl<T> Copy for PhantomContravariant<T>impl Copy for uint8x8x4_timpl<T: $crate::marker::Copy> Copy for Reverse<T>impl Copy for int64x1x3_timpl Copy for vector_signed_longimpl Copy for IpAddrimpl Copy for int64x2_timpl Copy for float16x4x2_timpl Copy for float64x2x3_timpl<Y: $crate::marker::Copy, R: $crate::marker::Copy> Copy for CoroutineState<Y, R>impl Copy for float32x2_timpl Copy for poly16x8x4_timpl Copy for __m256bhimpl Copy for f16impl Copy for Durationimpl Copy for int16x8x3_timpl Copy for poly64x2x2_timpl Copy for vector_signed_shortimpl<T: $crate::marker::Copy, E: $crate::marker::Copy> Copy for Result<T, E>impl Copy for uint8x16x2_timpl Copy for int64x1x4_timpl Copy for vector_unsigned_longimpl Copy for Ipv4Addrimpl Copy for uint64x2_timpl Copy for float16x4x3_timpl Copy for float64x2x4_timpl Copy for RangeFullimpl Copy for int64x1_timpl Copy for int32x2x2_timpl Copy for __m512bhimpl<T: $crate::marker::Copy> Copy for Saturating<T>impl Copy for f32impl<T: $crate::marker::Copy> Copy for Poll<T>impl Copy for int16x8x4_timpl Copy for poly64x2x3_timpl Copy for usizeimpl Copy for vector_unsigned_shortimpl Copy for Orderingimpl Copy for uint8x16x3_timpl Copy for int64x2x2_timpl Copy for vector_bool_longimpl Copy for Ipv6Addrimpl Copy for poly64x2_timpl Copy for float16x4x4_timpl Copy for v128impl<Idx: $crate::marker::Copy> Copy for RangeTo<Idx>impl Copy for uint64x1_timpl Copy for int32x2x3_timpl Copy for __m128himpl Copy for f64impl Copy for RawWakerVTableimpl Copy for uint16x4x2_timpl Copy for poly64x2x4_timpl Copy for u8impl Copy for vector_bool_shortimpl<T> Copy for NonZero<T>impl<'a> Copy for PhantomInvariantLifetime<'a>impl<T> Copy for Exclusive<T>impl Copy for uint8x16x4_timpl Copy for FpCategoryimpl Copy for int64x2x3_timpl Copy for vector_doubleimpl Copy for Ipv6MulticastScopeimpl Copy for float16x4_timpl Copy for float16x8x2_timpl Copy for vector_signed_charimpl<Idx: $crate::marker::Copy> Copy for RangeToInclusive<Idx>impl<T> Copy for PhantomCovariant<T>impl Copy for poly64x1_timpl Copy for Orderingimpl Copy for int32x2x4_timpl Copy for __m256himpl Copy for f128impl Copy for Layoutimpl Copy for uint16x4x3_timpl Copy for __m128iimpl Copy for u16impl Copy for vector_signed_intimpl Copy for Alignmentimpl Copy for poly8x8x2_timpl Copy for int64x2x4_timpl Copy for f16x2impl Copy for SocketAddrimpl Copy for float16x8_timpl Copy for float16x8x3_timpl Copy for Infallibleimpl Copy for vector_unsigned_charimpl<T: $crate::marker::Copy> Copy for Bound<T>impl Copy for int8x16_timpl Copy for int32x4x2_timpl Copy for __m512himpl Copy for boolimpl Copy for AllocErrorimpl Copy for uint16x4x4_timpl Copy for __m128impl Copy for u32impl Copy for vector_unsigned_intimpl Copy for Errorimpl Copy for poly8x8x3_timpl Copy for uint64x1x2_timpl Copy for m256iimpl Copy for SocketAddrV4impl Copy for int8x8x2_timpl<T: $crate::marker::Copy> Copy for Wrapping<T>impl Copy for float16x8x4_timpl Copy for vector_bool_charimpl<'a> Copy for PhantomContravariantLifetime<'a>impl Copy for TypeIdimpl Copy for uint8x16_timpl Copy for int32x4x3_timpl Copy for bf16impl Copy for charimpl Copy for int8x8_timpl Copy for uint16x8x2_timpl Copy for __m128dimpl Copy for u64impl Copy for vector_bool_intimpl Copy for Signimpl Copy for poly8x8x4_timpl Copy for uint64x1x3_timpl Copy for m256impl Copy for SocketAddrV6impl Copy for int8x8x3_timpl Copy for float32x2x2_timpl Copy for vector_signed_shortimpl Copy for TryFromSliceErrorimpl Copy for poly8x16_timpl Copy for int32x4x4_timpl Copy for CpuidResultimpl<T: PointeeSized> Copy for *const Timpl Copy for uint8x8_timpl Copy for uint16x8x3_timpl Copy for __m256iimpl<'a> Copy for PhantomCovariantLifetime<'a>impl Copy for u128impl Copy for vector_signed_long_longimpl<T: $crate::marker::Copy> Copy for MaybeUninit<T>impl Copy for DebugAsHeximpl Copy for poly8x16x2_timpl Copy for uint64x1x4_timpl Copy for m256dimpl<T: $crate::marker::Copy> Copy for Option<T>impl Copy for int8x8x4_timpl Copy for float32x2x3_timpl Copy for vector_unsigned_shortimpl<T: Copy, N: usize> Copy for [T; N]impl Copy for int16x8_timpl Copy for uint32x2x2_timpl Copy for float64x1_timpl<T: PointeeSized> Copy for *mut Timpl Copy for poly8x8_timpl Copy for uint16x8x4_timpl Copy for __m256impl Copy for isizeimpl Copy for vector_unsigned_long_longimpl Copy for FormattingOptionsimpl Copy for poly8x16x3_timpl Copy for uint64x2x2_timpl Copy for m128iimpl<'a> Copy for Location<'a>impl Copy for int8x16x2_timpl Copy for float32x2x4_timpl Copy for Localityimpl Copy for vector_bool_shortimpl Copy for AsciiCharimpl Copy for IntErrorKindimpl Copy for uint16x8_timpl Copy for uint32x2x3_timpl Copy for float64x2_timpl Copy for neverimpl Copy for int16x4_timpl Copy for poly16x4x2_timpl Copy for __m256dimpl Copy for i8impl Copy for vector_bool_long_longimpl<'a> Copy for Arguments<'a>impl Copy for poly8x16x4_timpl Copy for uint64x2x3_timpl Copy for m128impl<Ptr: $crate::marker::Copy> Copy for Pin<Ptr>impl Copy for int8x16x3_timpl Copy for float32x4x2_timpl Copy for vector_signed_intimpl Copy for CharTryFromErrorimpl Copy for poly16x8_timpl Copy for uint32x2x4_timpl Copy for float64x1x2_timpl<T: PointeeSized> Copy for &Timpl<T> Copy for Discriminant<T>impl Copy for uint16x4_timpl<T> Copy for PhantomInvariant<T>impl Copy for poly16x4x3_timpl Copy for __m512iimpl Copy for i16impl Copy for vector_floatimpl<'a, T: $crate::marker::Copy + 'a, N: usize> Copy for ArrayWindows<'a, T, N>impl Copy for Alignmentimpl Copy for int16x4x2_timpl<Dyn: PointeeSized> Copy for DynMetadata<Dyn>impl Copy for uint64x2x4_timpl Copy for m128dimpl<T: PointeeSized> Copy for NonNull<T>impl<Idx: $crate::marker::Copy> Copy for Range<Idx>impl Copy for int8x16x4_timpl Copy for float32x4x3_timpl Copy for vector_unsigned_intimpl Copy for TryFromCharErrorimpl<P: $crate::marker::Copy + ?Sized> Copy for MaybeDangling<P>impl Copy for int32x4_timpl Copy for uint32x4x2_timpl Copy for float64x1x3_timpl<T: PointeeSized> Copy for PhantomData<T>impl Copy for poly16x4_timpl Copy for poly16x4x4_timpl Copy for __m512impl Copy for i32impl Copy for vector_doubleimpl Copy for Utf8Errorimpl Copy for int16x4x3_timpl Copy for poly64x1x2_timpl Copy for vector_signed_charimpl<Idx: $crate::marker::Copy> Copy for RangeInclusive<Idx>impl Copy for uint8x8x2_timpl Copy for float32x4x4_timpl Copy for vector_bool_intimpl Copy for FromBytesWithNulErrorimpl Copy for uint32x4_timpl Copy for uint32x4x3_timpl Copy for float64x1x4_timpl Copy for PhantomPinnedimpl Copy for int32x2_timpl Copy for poly16x8x2_timpl Copy for __m512dimpl Copy for TryFromIntErrorimpl Copy for i64impl<T, N: usize> Copy for Mask<T, N>impl<'a> Copy for Utf8Pattern<'a>impl Copy for int16x4x4_timpl Copy for poly64x1x3_timpl<T: $crate::marker::Copy + ?Sized> Copy for ManuallyDrop<T>impl Copy for vector_unsigned_charimpl<Idx: $crate::marker::Copy> Copy for RangeFrom<Idx>impl Copy for uint8x8x3_t