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:
#[derive(Clone)]
struct MyStruct<T>(T);
impl<T: Copy> Copy for MyStruct<T> { }
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
:
#[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 implementCopy
(even if the referent doesn’t), while variables captured by mutable reference never implementCopy
.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementors§
impl Copy for AnsiColor
impl Copy for Color
impl Copy for Action
impl Copy for State
impl Copy for DependencyKind
impl Copy for DiagnosticLevel
impl Copy for Edition
impl Copy for ValueHint
impl Copy for ContextKind
impl Copy for clap_builder::error::kind::ErrorKind
impl Copy for ValueSource
impl Copy for clap_builder::util::color::ColorChoice
impl Copy for colorchoice::ColorChoice
impl Copy for Container
impl Copy for StackFrameOffset
impl Copy for UnwindOperation
impl Copy for PrefilterConfig
impl Copy for nom::error::ErrorKind
impl Copy for Needed
impl Copy for Endianness
impl Copy for oneshot_uniffi::errors::RecvTimeoutError
impl Copy for oneshot_uniffi::errors::TryRecvError
impl Copy for plain::error::Error
impl Copy for StrCtx
impl Copy for Endian
impl Copy for Op
impl Copy for Category
impl Copy for Radix
impl Copy for ExternalKind
impl Copy for ObjectImpl
impl Copy for Special
impl Copy for StringifierOrInheritOrStatic
impl Copy for StringifierOrStatic
impl Copy for FloatingPointType
impl Copy for IntegerType
impl Copy for TargetLanguage
impl Copy for Level
impl Copy for LevelFilter
impl Copy for AsciiChar
impl Copy for uniffi::deps::static_assertions::_core::cmp::Ordering
impl Copy for Infallible
impl Copy for uniffi::deps::static_assertions::_core::fmt::Alignment
impl Copy for DebugAsHex
impl Copy for Sign
impl Copy for IpAddr
impl Copy for Ipv6MulticastScope
impl Copy for SocketAddr
impl Copy for FpCategory
impl Copy for SearchStep
impl Copy for uniffi::deps::static_assertions::_core::sync::atomic::Ordering
impl Copy for SeekFrom
impl Copy for std::io::error::ErrorKind
impl Copy for Shutdown
impl Copy for BacktraceStyle
impl Copy for std::sync::mpsc::RecvTimeoutError
impl Copy for std::sync::mpsc::TryRecvError
impl Copy for _Unwind_Action
impl Copy for _Unwind_Reason_Code
impl Copy for bool
impl Copy for char
impl Copy for f16
impl Copy for f32
impl Copy for f64
impl Copy for f128
impl Copy for i8
impl Copy for i16
impl Copy for i32
impl Copy for i64
impl Copy for i128
impl Copy for isize
impl Copy for !
impl Copy for u8
impl Copy for u16
impl Copy for u32
impl Copy for u64
impl Copy for u128
impl Copy for usize
impl Copy for Ansi256Color
impl Copy for RgbColor
impl Copy for Effects
impl Copy for Reset
impl Copy for Style
impl Copy for LoopItem
impl Copy for FromPathError
impl Copy for ValueRange
impl Copy for BoolValueParser
impl Copy for BoolishValueParser
impl Copy for FalseyValueParser
impl Copy for NonEmptyStringValueParser
impl Copy for OsStringValueParser
impl Copy for PathBufValueParser
impl Copy for StringValueParser
impl Copy for MatchOptions
impl Copy for Ctx
impl Copy for goblin::elf::compression_header::compression_header32::CompressionHeader
impl Copy for goblin::elf::compression_header::compression_header64::CompressionHeader
impl Copy for goblin::elf::dynamic::dyn32::Dyn
impl Copy for goblin::elf::dynamic::dyn64::Dyn
impl Copy for goblin::elf::header::header32::Header
impl Copy for goblin::elf::header::header64::Header
impl Copy for goblin::elf::header::Header
impl Copy for Nhdr32
impl Copy for Nhdr64
impl Copy for goblin::elf::program_header::program_header32::ProgramHeader
impl Copy for goblin::elf::program_header::program_header64::ProgramHeader
impl Copy for goblin::elf::reloc::reloc32::Rela
impl Copy for goblin::elf::reloc::reloc64::Rela
impl Copy for Reloc
impl Copy for goblin::elf::section_header::section_header32::SectionHeader
impl Copy for goblin::elf::section_header::section_header64::SectionHeader
impl Copy for goblin::elf::sym::Sym
impl Copy for goblin::elf::sym::sym32::Sym
impl Copy for goblin::elf::sym::sym64::Sym
impl Copy for FatArch
impl Copy for FatHeader
impl Copy for Header32
impl Copy for Header64
impl Copy for goblin::mach::header::Header
impl Copy for BuildToolVersion
impl Copy for BuildVersionCommand
impl Copy for DataInCodeEntry
impl Copy for DyldInfoCommand
impl Copy for Dylib
impl Copy for DylibCommand
impl Copy for DylibModule64
impl Copy for DylibModule
impl Copy for DylibReference
impl Copy for DylibTableOfContents
impl Copy for DylinkerCommand
impl Copy for DysymtabCommand
impl Copy for EncryptionInfoCommand32
impl Copy for EncryptionInfoCommand64
impl Copy for EntryPointCommand
impl Copy for FvmfileCommand
impl Copy for Fvmlib
impl Copy for FvmlibCommand
impl Copy for IdentCommand
impl Copy for LinkeditDataCommand
impl Copy for LinkerOptionCommand
impl Copy for LoadCommandHeader
impl Copy for PrebindCksumCommand
impl Copy for PreboundDylibCommand
impl Copy for RoutinesCommand32
impl Copy for RoutinesCommand64
impl Copy for RpathCommand
impl Copy for Section32
impl Copy for Section64
impl Copy for SegmentCommand32
impl Copy for SegmentCommand64
impl Copy for SourceVersionCommand
impl Copy for SubClientCommand
impl Copy for SubFrameworkCommand
impl Copy for SubLibraryCommand
impl Copy for SubUmbrellaCommand
impl Copy for SymsegCommand
impl Copy for SymtabCommand
impl Copy for ThreadCommand
impl Copy for TwolevelHint
impl Copy for TwolevelHintsCommand
impl Copy for UuidCommand
impl Copy for VersionMinCommand
impl Copy for RelocationInfo
impl Copy for Nlist32
impl Copy for Nlist64
impl Copy for SymbolsCtx
impl Copy for DataDirectories
impl Copy for DataDirectory
impl Copy for ImageDebugDirectory
impl Copy for Register
impl Copy for RuntimeFunction
impl Copy for UnwindCode
impl Copy for ExportDirectoryTable
impl Copy for CoffHeader
impl Copy for DosHeader
impl Copy for goblin::pe::header::Header
impl Copy for OptionalHeader
impl Copy for StandardFields32
impl Copy for StandardFields64
impl Copy for StandardFields
impl Copy for WindowsFields32
impl Copy for WindowsFields64
impl Copy for ParseOptions
impl Copy for Relocation
impl Copy for AuxBeginAndEndFunction
impl Copy for AuxFunctionDefinition
impl Copy for AuxSectionDefinition
impl Copy for AuxWeakExternal
impl Copy for goblin::pe::symbol::Symbol
impl Copy for itoa::Buffer
impl Copy for memchr::arch::all::memchr::One
impl Copy for memchr::arch::all::memchr::Three
impl Copy for memchr::arch::all::memchr::Two
impl Copy for memchr::arch::all::packedpair::Finder
impl Copy for Pair
impl Copy for memchr::arch::all::twoway::Finder
impl Copy for FinderRev
impl Copy for memchr::arch::x86_64::avx2::memchr::One
impl Copy for memchr::arch::x86_64::avx2::memchr::Three
impl Copy for memchr::arch::x86_64::avx2::memchr::Two
impl Copy for memchr::arch::x86_64::avx2::packedpair::Finder
impl Copy for memchr::arch::x86_64::sse2::memchr::One
impl Copy for memchr::arch::x86_64::sse2::memchr::Three
impl Copy for memchr::arch::x86_64::sse2::memchr::Two
impl Copy for memchr::arch::x86_64::sse2::packedpair::Finder
impl Copy for oneshot_uniffi::errors::RecvError
impl Copy for ryu::buffer::Buffer
impl Copy for Sleb128
impl Copy for Uleb128
impl Copy for IgnoredAny
impl Copy for Hash128
impl Copy for siphasher::sip128::SipHasher13
impl Copy for siphasher::sip128::SipHasher24
impl Copy for siphasher::sip128::SipHasher
impl Copy for siphasher::sip::SipHasher13
impl Copy for siphasher::sip::SipHasher24
impl Copy for siphasher::sip::SipHasher
impl Copy for BooleanLit
impl Copy for EmptyArrayLit
impl Copy for EmptyDictionaryLit
impl Copy for Any
impl Copy for ArrayBuffer
impl Copy for ArrayBufferView
impl Copy for Assign
impl Copy for Async
impl Copy for Attribute
impl Copy for Boolean
impl Copy for BufferSource
impl Copy for Byte
impl Copy for ByteString
impl Copy for Callback
impl Copy for CloseBrace
impl Copy for CloseBracket
impl Copy for CloseParen
impl Copy for Colon
impl Copy for Comma
impl Copy for Const
impl Copy for Constructor
impl Copy for DOMString
impl Copy for DataView
impl Copy for Deleter
impl Copy for Dictionary
impl Copy for Dot
impl Copy for Double
impl Copy for Ellipsis
impl Copy for Enum
impl Copy for weedle::term::Error
impl Copy for False
impl Copy for Float32Array
impl Copy for Float64Array
impl Copy for Float
impl Copy for FrozenArray
impl Copy for Getter
impl Copy for GreaterThan
impl Copy for Implements
impl Copy for Includes
impl Copy for Infinity
impl Copy for Inherit
impl Copy for Int8Array
impl Copy for Int16Array
impl Copy for Int32Array
impl Copy for Interface
impl Copy for Iterable
impl Copy for LegacyCaller
impl Copy for LessThan
impl Copy for Long
impl Copy for Maplike
impl Copy for Minus
impl Copy for Mixin
impl Copy for NaN
impl Copy for Namespace
impl Copy for NegInfinity
impl Copy for Null
impl Copy for Object
impl Copy for Octet
impl Copy for OpenBrace
impl Copy for OpenBracket
impl Copy for OpenParen
impl Copy for Optional
impl Copy for Or
impl Copy for Partial
impl Copy for Promise
impl Copy for QMark
impl Copy for ReadOnly
impl Copy for Record
impl Copy for Required
impl Copy for SemiColon
impl Copy for Sequence
impl Copy for Setlike
impl Copy for Setter
impl Copy for Short
impl Copy for Static
impl Copy for Stringifier
impl Copy for weedle::term::Symbol
impl Copy for True
impl Copy for Typedef
impl Copy for USVString
impl Copy for Uint8Array
impl Copy for Uint8ClampedArray
impl Copy for Uint16Array
impl Copy for Uint32Array
impl Copy for Undefined
impl Copy for Unrestricted
impl Copy for Unsigned
impl Copy for DoubleType
impl Copy for FloatType
impl Copy for LongLongType
impl Copy for LongType
impl Copy for ShortType
impl Copy for ForeignExecutorHandle
impl Copy for AllocError
impl Copy for Layout
impl Copy for TypeId
impl Copy for CpuidResult
impl Copy for __m128
impl Copy for __m128bh
impl Copy for __m128d
impl Copy for __m128h
impl Copy for __m128i
impl Copy for __m256
impl Copy for __m256bh
impl Copy for __m256d
impl Copy for __m256h
impl Copy for __m256i
impl Copy for __m512
impl Copy for __m512bh
impl Copy for __m512d
impl Copy for __m512h
impl Copy for __m512i
impl Copy for bf16
impl Copy for TryFromSliceError
impl Copy for CharTryFromError
impl Copy for TryFromCharError
impl Copy for uniffi::deps::static_assertions::_core::fmt::Error
impl Copy for FormattingOptions
impl Copy for Assume
impl Copy for Ipv4Addr
impl Copy for Ipv6Addr
impl Copy for SocketAddrV4
impl Copy for SocketAddrV6
impl Copy for TryFromIntError
impl Copy for RangeFull
impl Copy for uniffi::deps::static_assertions::_core::ptr::Alignment
impl Copy for Utf8Error
impl Copy for RawWakerVTable
impl Copy for Duration
impl Copy for Global
impl Copy for System
impl Copy for FileTimes
impl Copy for FileType
impl Copy for Empty
impl Copy for Sink
impl Copy for UCred
impl Copy for ExitCode
impl Copy for ExitStatus
impl Copy for ExitStatusError
impl Copy for DefaultRandomSource
impl Copy for std::sync::mpsc::RecvError
impl Copy for WaitTimeoutResult
impl Copy for AccessError
impl Copy for ThreadId
impl Copy for Instant
impl Copy for SystemTime
impl Copy for PhantomPinned
impl<'a> Copy for Utf8Component<'a>
impl<'a> Copy for Utf8Prefix<'a>
impl<'a> Copy for UnwindHandler<'a>
impl<'a> Copy for Unexpected<'a>
impl<'a> Copy for IdentifierOrString<'a>
impl<'a> Copy for ConstValue<'a>
impl<'a> Copy for DefaultValue<'a>
impl<'a> Copy for FloatLit<'a>
impl<'a> Copy for IntegerLit<'a>
impl<'a> Copy for Utf8Pattern<'a>
impl<'a> Copy for Component<'a>
impl<'a> Copy for Prefix<'a>
impl<'a> Copy for Utf8Ancestors<'a>
impl<'a> Copy for Utf8PrefixComponent<'a>
impl<'a> Copy for goblin::archive::Header<'a>
impl<'a> Copy for CodeviewPDB70DebugInfo<'a>
impl<'a> Copy for DebugData<'a>
impl<'a> Copy for ExtendedAttributeIdent<'a>
impl<'a> Copy for ExtendedAttributeNoArgs<'a>
impl<'a> Copy for Default<'a>
impl<'a> Copy for Identifier<'a>
impl<'a> Copy for Inheritance<'a>
impl<'a> Copy for DecLit<'a>
impl<'a> Copy for FloatValueLit<'a>
impl<'a> Copy for HexLit<'a>
impl<'a> Copy for OctLit<'a>
impl<'a> Copy for StringLit<'a>
impl<'a> Copy for Arguments<'a>
impl<'a> Copy for Location<'a>
impl<'a> Copy for IoSlice<'a>
impl<'a> Copy for Ancestors<'a>
impl<'a> Copy for PrefixComponent<'a>
impl<'a, E> Copy for BytesDeserializer<'a, E>
impl<'a, T, const N: usize> Copy for ArrayWindows<'a, T, N>where
T: Copy + 'a,
impl<'de, E> Copy for BorrowedBytesDeserializer<'de, E>
impl<'de, E> Copy for BorrowedStrDeserializer<'de, E>
impl<'de, E> Copy for StrDeserializer<'de, E>
impl<'fd> Copy for BorrowedFd<'fd>
impl<B, C> Copy for ControlFlow<B, C>
impl<Dyn> Copy for DynMetadata<Dyn>where
Dyn: ?Sized,
impl<E> Copy for BoolDeserializer<E>
impl<E> Copy for CharDeserializer<E>
impl<E> Copy for F32Deserializer<E>
impl<E> Copy for F64Deserializer<E>
impl<E> Copy for I8Deserializer<E>
impl<E> Copy for I16Deserializer<E>
impl<E> Copy for I32Deserializer<E>
impl<E> Copy for I64Deserializer<E>
impl<E> Copy for I128Deserializer<E>
impl<E> Copy for IsizeDeserializer<E>
impl<E> Copy for U8Deserializer<E>
impl<E> Copy for U16Deserializer<E>
impl<E> Copy for U32Deserializer<E>
impl<E> Copy for U64Deserializer<E>
impl<E> Copy for U128Deserializer<E>
impl<E> Copy for UnitDeserializer<E>
impl<E> Copy for UsizeDeserializer<E>
impl<F> Copy for RepeatWith<F>where
F: Copy,
impl<Idx> Copy for RangeTo<Idx>where
Idx: Copy,
impl<Idx> Copy for RangeToInclusive<Idx>where
Idx: Copy,
impl<Idx> Copy for Range<Idx>where
Idx: Copy,
impl<Idx> Copy for RangeFrom<Idx>where
Idx: Copy,
impl<Idx> Copy for RangeInclusive<Idx>where
Idx: Copy,
impl<Ptr> Copy for Pin<Ptr>where
Ptr: Copy,
impl<T> Copy for Resettable<T>where
T: Copy,
impl<T> Copy for Bound<T>where
T: Copy,
impl<T> Copy for Option<T>where
T: Copy,
impl<T> Copy for Poll<T>where
T: Copy,
impl<T> Copy for SendTimeoutError<T>where
T: Copy,
impl<T> Copy for TrySendError<T>where
T: Copy,
impl<T> Copy for *const Twhere
T: ?Sized,
impl<T> Copy for *mut Twhere
T: ?Sized,
impl<T> Copy for &Twhere
T: ?Sized,
Shared references can be copied, but mutable references cannot!