Copy isn't an auto trait, like
Sync is, which would be what you're suggesting (an opt-out model instead of an opt-in model). It's probably designed that way because it would be more verbose to make it an opt-out system than an opt-in system, when, for example, you want to insert
Clone code which a
Copy wouldn't override. Also, since auto traits are transitive (IE, if all the members of
X implements the trait, then unless
!Trait is implemented for
X, it implements the trait), it is much more prone to bugs because your
struct wouldn't fail at the implementation of
Copy (it would just be silently omitted) instead it would fail at each usage site.
Another thing to notice is that
Copy is intended for small things. A good way to keep it efficient I've heard of is to keep it about the size of a register.