I am trying to learn this std::move.
Well IMHO its name is a bit misleading. It sounds like std::move moves,
or that it guarantees a move. But on the contrary, all it does is to
tell (to an assignment or initialization destination) that in your
opinion the argument /can/ be moved, i.e. that the particular value of
that argument after this does not matter to you.
So I think std::move should have been std::movable, or -- but it gets
too verbose -- std::discardable or std:

ilferable.
Anyway, it indicates the movability (that you don't care what happens
with the argument) by producing an rvalue reference (T&&), importantly
with the invocation expression as an rvalue.
C++11 §5.2.2/10
"A function call is an lvalue if the result type is an lvalue reference
type or an rvalue reference to function type, an xvalue if the result
type is an rvalue reference to object type, and a prvalue otherwise."
From §3.10 (you need fixed width font to see this properly):
expression
/ \
glvalue rvalue
/ \ / \
lvalue xvalue prvalue
To see what kind of value an expression is, go upward in the chain. So
`move( x )` is an xvalue, by 5.2.2/10, which up to the right says it is
also an rvalue. Just as in C++03 /every/ expression is either an lvalue
or an rvalue, but the finer classification in C++11 helps with things.
And when the expression is an rvalue, as in this case, it can be bound
to an rvalue reference formal argument. I.e., your std::move rvalue
expression can be bound to the argument of a /move constructor/ or a
/move assignment operator/. In this way `std::move` directs the overload
resolution, choosing which constructor or assignment op.
A simple question, but I have not found answer after googling.
Trying to understand why this code swaps the strings:
string s = "Orig s";
string t("Orig t");
t = std::move(s);
so now s is "Orig t"
You can't rely on such behavior.
As far as the Holy Standard is concerned, what happens here is that
1 std::move( s ) produces a string&&, importantly /as an rvalue/.
2 That rvalue expression can be bound to the /move assignment/
operator's formal argument, which is string&& (if the expression was an
lvalue then it couldn't be so bound, and the normal copy assignment
operator would be chosen).
3 The move assignment operator is free to plunder and rape (whatever)
the argument, in order to yield the outward appearance of a value
assignment to everybody who agree to not look at the possibly quite
sorry state of s afterwards.
The purpose of this is to do things more efficiently when that's possible.
I.e. it's an /optimization/, designed to yield the same logical effect
as a copy assignment, when one just ignores that which does not matter.
1) Is it because string-classes move-constructor swaps them? It sets s to be
t? If this is the case, are *all* move contructors doing this? Are all std
library constructors doing this? Should all move-contructor do this
(swapping)? How do I know which classes move contructors swap values?
For your particular implementation the values are swapped. They're
swapped by the move assignment operator. It is a simple implementation
strategy for moving, a valid way to move, whose purpose is to let the
destructor of the argument object take care of cleanup.
2) I hear them saying that "after move s is in an unspecified state".
Meaning it has a value which can basically be anything. Why they say like
that if s is t (in this case)? Why the websites confuse me with this... ??
Much information on the internets is vague and unreliable.

. It clearly is *not* in an unspecified state if it has the value of t.
It's unspecified by the C++ standard (the C++ standard does not specify)
whether your implementation will produce t or something else.
If the implementation makes that a guarantee, then you can rely on that
guarantee for your implementation, regardless of the C++ standard.
If it doesn't (and why should it), then all you have to rely on for
portability is the C++ standard.
However, many people tend to forget that there is a practical /purpose/
in the end, and talk about e.g. general "UB" (as if UB could be a
context independent property) etc. Just keep in mind what you're doing
and why. With respect to the C++ standard, the value is unspecified.
If somebody can clear these would be good. I can go forward...

thanks
Cheers & hth.,
- Alf