In addition, there's this: suppose you have a struct containing a (mutable) array. When you make a copy of that struct, you will almost always want to make a copy of the contained array. Therefore value semantics should be the default, because it simplifies the most common use case.
That's what struct ctors/dtors/opAssign are for. Personally, I think letting the struct designer decide the behaviour is better.