Trait sgx_tstd::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

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!

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;

You can also implement Copy and Clone manually:

struct MyStruct;

impl Copy for MyStruct { }

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

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

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

struct PointList {
    points: Vec<Point>,
}

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

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 PolledOk

source§

impl Copy for OCallError

source§

impl Copy for AddressKind

source§

impl Copy for SockAddr

source§

impl Copy for DIR

source§

impl Copy for MapAddr

source§

impl Copy for FutexClockId

source§

impl Copy for FutexOp

source§

impl Copy for PageType

source§

impl Copy for Feature

source§

impl Copy for Version

source§

impl Copy for ExceptionType

source§

impl Copy for ExceptionVector

source§

impl Copy for HandleResult

source§

impl Copy for PceError

source§

impl Copy for QcnlError

source§

impl Copy for Quote3Error

source§

impl Copy for SgxStatus

source§

impl Copy for DirIndex

source§

impl Copy for EcResult

source§

impl Copy for RsaKeyType

source§

impl Copy for RsaResult

source§

impl Copy for PckCertFlag

source§

impl Copy for ProdType

source§

impl Copy for QeType

source§

impl Copy for QlAttestationAlgorithmId

source§

impl Copy for QlCertKeyType

source§

impl Copy for QlConfigVersion

source§

impl Copy for QlLogLevel

source§

impl Copy for QlPathType

source§

impl Copy for QlQvResult

source§

impl Copy for QlRequestPolicy

source§

impl Copy for QvPathType

source§

impl Copy for DhSessionRole

source§

impl Copy for EnclaveMode

source§

impl Copy for KeyName

source§

impl Copy for ProtectPerm

source§

impl Copy for RaKeyType

source§

impl Copy for QuoteSignType

source§

impl Copy for SwitchlessWokerEvent

source§

impl Copy for SwitchlessWokerType

source§

impl Copy for SgxDeviceStatus

source§

impl Copy for AsciiChar

source§

impl Copy for sgx_tstd::cmp::Ordering

1.34.0 · source§

impl Copy for Infallible

1.28.0 · source§

impl Copy for sgx_tstd::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 SearchStep

source§

impl Copy for sgx_tstd::sync::atomic::Ordering

source§

impl Copy for TcsPolicy

source§

impl Copy for Which

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 usize

source§

impl Copy for AlignLayout

source§

impl Copy for AlignReq

source§

impl Copy for addr_info

source§

impl Copy for sgx_oc::linux::ocall::cpuid::CpuidResult

source§

impl Copy for AddrInfo

source§

impl Copy for AddrInfoHints

source§

impl Copy for MsgHdrFlags

source§

impl Copy for addrinfo

source§

impl Copy for cmsghdr

source§

impl Copy for cpu_set_t

source§

impl Copy for dirent64

source§

impl Copy for dirent

source§

impl Copy for epoll_event

source§

impl Copy for fd_set

source§

impl Copy for hostent

source§

impl Copy for in6_addr

source§

impl Copy for in_addr

source§

impl Copy for iovec

source§

impl Copy for ip_mreq

source§

impl Copy for ipv6_mreq

source§

impl Copy for linger

source§

impl Copy for msghdr

source§

impl Copy for passwd

source§

impl Copy for pollfd

source§

impl Copy for sigaction

source§

impl Copy for siginfo_t

source§

impl Copy for sigset_t

source§

impl Copy for sigval

source§

impl Copy for sockaddr

source§

impl Copy for sockaddr_in6

source§

impl Copy for sockaddr_in

source§

impl Copy for sockaddr_ll

source§

impl Copy for sockaddr_nl

source§

impl Copy for sockaddr_storage

source§

impl Copy for sockaddr_un

source§

impl Copy for stat64

source§

impl Copy for stat

source§

impl Copy for timeval

source§

impl Copy for tm

source§

impl Copy for ucred

source§

impl Copy for utsname

source§

impl Copy for winsize

source§

impl Copy for Nothing

source§

impl Copy for Zero

source§

impl Copy for FutexFlags

source§

impl Copy for Timespec

source§

impl Copy for PageFlags

source§

impl Copy for PageInfo

source§

impl Copy for PageRange

source§

impl Copy for AlignKeyRequest

source§

impl Copy for AlignReport2Mac

source§

impl Copy for AlignReport

source§

impl Copy for AlignReportData

source§

impl Copy for AlignTargetInfo

source§

impl Copy for TcsId

source§

impl Copy for CpuContext

source§

impl Copy for ExceptionInfo

source§

impl Copy for Handle

source§

impl Copy for CssBody

source§

impl Copy for CssBuffer

source§

impl Copy for CssHeader

source§

impl Copy for CssKey

source§

impl Copy for DataDir

source§

impl Copy for ElRangeConfig

source§

impl Copy for EnclaveCss

source§

impl Copy for MetaData

source§

impl Copy for AlignEc256PrivateKey

source§

impl Copy for AlignEc256SharedKey

source§

impl Copy for AlignKey128bit

source§

impl Copy for AlignKey256bit

source§

impl Copy for AlignMac128bit

source§

impl Copy for AlignMac256bit

source§

impl Copy for Ec256PrivateKey

source§

impl Copy for Ec256PublicKey

source§

impl Copy for Ec256SharedKey

source§

impl Copy for Ec256Signature

source§

impl Copy for Rsa2048Key

source§

impl Copy for Rsa2048Param

source§

impl Copy for Rsa2048PrivKey

source§

impl Copy for Rsa2048PubKey

source§

impl Copy for Rsa2048Signature

source§

impl Copy for Rsa3072Key

source§

impl Copy for Rsa3072Param

source§

impl Copy for Rsa3072PrivKey

source§

impl Copy for Rsa3072PubKey

source§

impl Copy for Rsa3072Signature

source§

impl Copy for Sha1Hash

source§

impl Copy for Sha256Hash

source§

impl Copy for Sha384Hash

source§

impl Copy for Sm3Hash

source§

impl Copy for PceInfo

source§

impl Copy for QlAuthData

source§

impl Copy for QlCertificationData

source§

impl Copy for QlEcdsaSigData

source§

impl Copy for QlPPIDRsa3072EncryptedCertInfo

source§

impl Copy for QlQe3Id

source§

impl Copy for QlQeReportInfo

source§

impl Copy for QlQvSupplemental

source§

impl Copy for QlQveCollateralParam

source§

impl Copy for Quote3

source§

impl Copy for QuoteHeader

source§

impl Copy for CDhMsg1

source§

impl Copy for CDhMsg2

source§

impl Copy for CDhMsg3

source§

impl Copy for CDhMsg3Body

source§

impl Copy for CDhSession

source§

impl Copy for CEnclaveIdentity

source§

impl Copy for CRaMsg1

source§

impl Copy for CRaMsg2

source§

impl Copy for CRaMsg3

source§

impl Copy for PsSecPropDesc

source§

impl Copy for AttKeyId

source§

impl Copy for AttKeyIdExt

source§

impl Copy for BaseName

source§

impl Copy for PlatformInfo

source§

impl Copy for QeReportInfo

source§

impl Copy for QlAttKeyId

source§

impl Copy for Quote

source§

impl Copy for QuoteNonce

source§

impl Copy for Spid

source§

impl Copy for UpdateInfoBit

source§

impl Copy for CDcapMRaMsg2

source§

impl Copy for CDcapRaMsg1

source§

impl Copy for CDcapRaMsg3

source§

impl Copy for CDcapURaMsg2

source§

impl Copy for EnclaveIdentity

source§

impl Copy for timespec

source§

impl Copy for Report2

source§

impl Copy for Report2Mac

source§

impl Copy for TeeAttributes

source§

impl Copy for TeeCpuSvn

source§

impl Copy for TeeMeasurement

source§

impl Copy for TeeReportData

source§

impl Copy for TeeReportType

source§

impl Copy for CAesGcmData

source§

impl Copy for CSealedData

source§

impl Copy for Attributes

source§

impl Copy for AttributesFlags

source§

impl Copy for ConfigId

source§

impl Copy for CpuSvn

source§

impl Copy for KeyId

source§

impl Copy for KeyPolicy

source§

impl Copy for KeyRequest

source§

impl Copy for Measurement

source§

impl Copy for MiscAttribute

source§

impl Copy for MiscSelect

source§

impl Copy for Report

source§

impl Copy for ReportBody

source§

impl Copy for ReportData

source§

impl Copy for TargetInfo

source§

impl Copy for SwitchlessConfig

source§

impl Copy for SwitchlessWokerStats

source§

impl Copy for EcdsaSigDataV4

source§

impl Copy for QeReportCertificationData

source§

impl Copy for Quote4

source§

impl Copy for Quote4Header

source§

impl Copy for Report2Body

source§

impl Copy for TeeInfo

source§

impl Copy for TeeTcbInfo

source§

impl Copy for TeeTcbSvn

source§

impl Copy for KssConfig

source§

impl Copy for AllocError

source§

impl Copy for Global

1.28.0 · source§

impl Copy for Layout

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

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 sgx_tstd::ptr::Alignment

source§

impl Copy for Utf8Error

source§

impl Copy for WaitTimeoutResult

1.36.0 · source§

impl Copy for RawWakerVTable

source§

impl Copy for ThreadId

1.3.0 · source§

impl Copy for Duration

source§

impl Copy for Instant

source§

impl Copy for SystemTime

source§

impl Copy for FileTimes

source§

impl Copy for FileType

1.27.0 · source§

impl Copy for core::core_arch::x86::cpuid::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.76.0 · source§

impl Copy for __m512

source§

impl Copy for __m512bh

1.76.0 · source§

impl Copy for __m512d

1.76.0 · source§

impl Copy for __m512i

source§

impl Copy for TimSortRun

1.33.0 · source§

impl Copy for PhantomPinned

§

impl Copy for _Unwind_Action

§

impl Copy for _Unwind_Reason_Code

source§

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

source§

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

source§

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

source§

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

1.10.0 · source§

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

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,

source§

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

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,

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 Twhere T: ?Sized,

source§

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

source§

impl<T> Copy for &Twhere 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,

source§

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

1.25.0 · source§

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

1.74.0 · source§

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

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<Y, R> Copy for CoroutineState<Y, R>where Y: Copy, R: Copy,