Copy
Copy
designates types for which making a bitwise copy creates a valid instance without invalidating the original instance.
This isn’t true for String
, because String
contains a pointer to the string data on the heap and assumes it has unique ownership of that data. When you drop a String
, it deallocates the data on the heap. If you had made a bitwise copy of a String
, then both instances would try to deallocate the same memory block, which is undefined behaviour.
Since String
doesn’t implement Copy
, your enum
cannot implement Copy
either because the compiler enforces that Copy
types are composed only of Copy
data members.
Clone
Clone
merely provides a standard clone
method, and it’s up to each implementor to decide how to implement it. String
does implement Clone
, so you can put #[derive(Clone)]
on your enum
.