# Trait std::marker::Copy

1.0.0 · source ·

    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 value

Run

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`.
    #[derive(Debug, Copy, Clone)]
    struct Foo;

    let x = Foo;

    let y = x;

    // `y` is a copy of `x`

    println!("{x:?}"); // A-OK!

Run

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`:

    #[derive(Copy, Clone)]
    struct MyStruct;

Run

You can also implement `Copy` and `Clone` manually:

    struct MyStruct;

    impl Copy for MyStruct { }

    impl Clone for MyStruct {
        fn clone(&self) -> MyStruct {
            *self
        }
    }

Run

There 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,
    }

Run

A struct can be `Copy`, and `i32` is `Copy`, therefore `Point` is eligible to be `Copy`. By contrast, consider

    struct PointList {
        points: Vec<Point>,
    }

Run

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:

    #[derive(Copy, Clone)]
    struct PointListWrapper<'a> {
        point_list_ref: &'a PointList,
    }

Run

### 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 `Copy` themselves. Note that variables captured by shared reference always implement `Copy` (even if the referent doesn’t), while variables captured by mutable reference never implement `Copy`.

## Object Safety§

This trait is not object safe.

## Implementors§

source§

### impl Copy for AsciiChar

source§

### impl Copy for std::cmp::Ordering

1.34.0 · source§

### impl Copy for Infallible

1.28.0 · source§

### impl Copy for std::fmt::Alignment

source§

### impl Copy for ErrorKind

source§

### impl Copy for SeekFrom

1.7.0 · source§

### impl Copy for IpAddr

source§

### impl Copy for Ipv6MulticastScope

source§

### impl Copy for Shutdown

source§

### impl Copy for SocketAddr

source§

### impl Copy for FpCategory

source§

### impl Copy for BacktraceStyle

source§

### impl Copy for Which

source§

### impl Copy for SearchStep

source§

### impl Copy for std::sync::atomic::Ordering

1.12.0 · source§

### impl Copy for RecvTimeoutError

source§

### impl Copy for TryRecvError

source§

### impl Copy for bool

source§

### impl Copy for char

source§

### impl Copy for f32

source§

### impl Copy for f64

source§

### impl Copy for i8

source§

### impl Copy for i16

source§

### impl Copy for i32

source§

### impl Copy for i64

source§

### impl Copy for i128

source§

### impl Copy for isize

source§

### impl Copy for !

source§

### impl Copy for u8

source§

### impl Copy for u16

source§

### impl Copy for u32

source§

### impl Copy for u64

source§

### impl Copy for u128

source§

### impl Copy for ()

source§

### impl Copy for usize

1.27.0 · source§

### impl Copy for CpuidResult

1.27.0 · source§

### impl Copy for __m128

source§

### impl Copy for __m128bh

1.27.0 · source§

### impl Copy for __m128d

1.27.0 · source§

### impl Copy for __m128i

1.27.0 · source§

### impl Copy for __m256

source§

### impl Copy for __m256bh

1.27.0 · source§

### impl Copy for __m256d

1.27.0 · source§

### impl Copy for __m256i

1.75.0 · source§

### impl Copy for __m512

source§

### impl Copy for __m512bh

1.75.0 · source§

### impl Copy for __m512d

1.75.0 · source§

### impl Copy for __m512i

source§

### impl Copy for TimSortRun

source§

### impl Copy for AllocError

source§

### impl Copy for Global

1.28.0 · source§

### impl Copy for Layout

1.28.0 · source§

### impl Copy for System

source§

### impl Copy for TypeId

1.34.0 · source§

### impl Copy for TryFromSliceError

1.34.0 · source§

### impl Copy for CharTryFromError

1.59.0 · source§

### impl Copy for TryFromCharError

source§

### impl Copy for Error

1.75.0 · source§

### impl Copy for FileTimes

1.1.0 · source§

### impl Copy for FileType

source§

### impl Copy for Empty

source§

### impl Copy for Sink

source§

### impl Copy for Assume

source§

### impl Copy for Ipv4Addr

source§

### impl Copy for Ipv6Addr

source§

### impl Copy for SocketAddrV4

source§

### impl Copy for SocketAddrV6

1.34.0 · source§

### impl Copy for NonZeroI8

1.34.0 · source§

### impl Copy for NonZeroI16

1.34.0 · source§

### impl Copy for NonZeroI32

1.34.0 · source§

### impl Copy for NonZeroI64

1.34.0 · source§

### impl Copy for NonZeroI128

1.34.0 · source§

### impl Copy for NonZeroIsize

1.28.0 · source§

### impl Copy for NonZeroU8

1.28.0 · source§

### impl Copy for NonZeroU16

1.28.0 · source§

### impl Copy for NonZeroU32

1.28.0 · source§

### impl Copy for NonZeroU64

1.28.0 · source§

### impl Copy for NonZeroU128

1.28.0 · source§

### impl Copy for NonZeroUsize

1.34.0 · source§

### impl Copy for TryFromIntError

source§

### impl Copy for RangeFull

source§

### impl Copy for UCred

Available on Unix only.
1.61.0 · source§

### impl Copy for ExitCode

source§

### impl Copy for ExitStatus

source§

### impl Copy for ExitStatusError

source§

### impl Copy for std::ptr::Alignment

source§

### impl Copy for Utf8Error

source§

### impl Copy for RecvError

1.5.0 · source§

### impl Copy for WaitTimeoutResult

1.36.0 · source§

### impl Copy for RawWakerVTable

1.26.0 · source§

### impl Copy for AccessError

1.19.0 · source§

### impl Copy for ThreadId

1.3.0 · source§

### impl Copy for Duration

1.8.0 · source§

### impl Copy for Instant

1.8.0 · source§

### impl Copy for SystemTime

1.33.0 · source§

### impl Copy for PhantomPinned

source§

### impl<'a> Copy for Component<'a>

source§

### impl<'a> Copy for Prefix<'a>

source§

### impl<'a> Copy for Arguments<'a>

1.36.0 · source§

### impl<'a> Copy for IoSlice<'a>

1.10.0 · source§

### impl<'a> Copy for Location<'a>

1.28.0 · source§

### impl<'a> Copy for Ancestors<'a>

source§

### impl<'a> Copy for PrefixComponent<'a>

source§

### impl<'a, T, const N: usize> Copy for ArrayWindows<'a, T, N>where T: Copy + 'a,

1.63.0 · source§

### impl<'fd> Copy for BorrowedFd<'fd>

1.63.0 · source§

### impl<'handle> Copy for BorrowedHandle<'handle>

Available on Windows only.
1.63.0 · source§

### impl<'socket> Copy for BorrowedSocket<'socket>

Available on Windows only.
1.55.0 · source§

### impl<B, C> Copy for ControlFlow<B, C>where B: Copy, C: Copy,

source§

### impl<Dyn> Copy for DynMetadata<Dyn>where Dyn: ?Sized,

1.28.0 · source§

### impl<F> Copy for RepeatWith<F>where F: Copy,

source§

### impl<Idx> Copy for RangeTo<Idx>where Idx: Copy,

1.26.0 · source§

### impl<Idx> Copy for RangeToInclusive<Idx>where Idx: Copy,

1.33.0 · source§

### impl<P> Copy for Pin<P>where P: Copy,

source§

### impl<Ret, T> Copy for fn (T₁, T₂, …, Tₙ) -> Ret

This trait is implemented on function pointers with any number of arguments.

1.17.0 · source§

### impl<T> Copy for Bound<T>where T: Copy,

source§

### impl<T> Copy for Option<T>where T: Copy,

1.36.0 · source§

### impl<T> Copy for Poll<T>where T: Copy,

source§

### impl<T> Copy for *const T where T: ?Sized,

source§

### impl<T> Copy for *mut T where T: ?Sized,

source§

### impl<T> Copy for &T where T: ?Sized,

Shared references can be copied, but mutable references cannot!

1.19.0 · source§

### impl<T> Copy for Reverse<T>where T: Copy,

1.21.0 · source§

### impl<T> Copy for Discriminant<T>

1.20.0 · source§

### impl<T> Copy for ManuallyDrop<T>where T: Copy + ?Sized,

1.74.0 · source§

### impl<T> Copy for Saturating<T>where T: Copy,

source§

### impl<T> Copy for Wrapping<T>where T: Copy,

1.25.0 · source§

### impl<T> Copy for NonNull<T>where T: ?Sized,

source§

### impl<T> Copy for PhantomData<T>where T: ?Sized,

1.36.0 · source§

### impl<T> Copy for MaybeUninit<T>where T: Copy,

source§

### impl<T, E> Copy for Result<T, E>where T: Copy, E: Copy,

source§

### impl<T, const LANES: usize> Copy for Mask<T, LANES>where T: MaskElement, LaneCount<LANES>: SupportedLaneCount,

1.58.0 · source§

### impl<T, const N: usize> Copy for [T; N]where T: Copy,

source§

### impl<T, const N: usize> Copy for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement,

source§

### impl<T: Copy> Copy for TrySendError<T>

source§

### impl<T: Copy> Copy for SendError<T>

source§

### impl<Y, R> Copy for CoroutineState<Y, R>where Y: Copy, R: Copy,