let s = S { ... }; // suppose S implements Copy
let s1 = s; // This is a copy. Can we force it to be a move with some special syntax?
Just curious to ask. I cannot think of any valid use cases as copy and move are both plane bit copies in this case. Besides, it doesn't seem to make sense to invalid s because it is, well, valid by definition. In addition there are no side effect differences anyway since S does not drop. But, maybe in certain cases such syntactical requirement is good to have (to denote some "ownership" transfer symbolically)?
Another way to ask: is there a C++ std::move equivalent in Rust? Or it's not needed in Rust in any possible cases due to the language design?
There is no difference between a copy and a move besides the fact that you can access the previous value for Copy types. So there is no need for this sort of construct.
Note that with C++ std::move is necessary because copying things around is the default and copying can be expensive. std::move is a cheaper alternative to the default. With Rust the default is a bit-copy, doesn't get better than that, so there is no need for something like std::move