rustc [E0277]: the trait bound U: std::marker::Copy is not satisfied
the trait std::marker::Copy is not implemented for U
rustc [E0277]: the trait bound T: std::marker::Copy is not satisfied
the trait std::marker::Copy is not implemented for T
Not necessary. PhantomData has an impl of the Copy trait with no bounds on the type of <T> .
Tuples and types have nothing do with it. If you're #[derive(Clone, Copy)]-ing your StreamWrapper by the time your code is about to compile it will expand to:
It's not implementation that is different (it indeed is effectively the same). It's the bounds. derive always restricts all generic parameters, no matter how exactly are they used.