What's the difference between:

1)
Code:
inline Foo operator + (const Foo& L, const Foo& R) {
    return Foo(L) += R;
}
2)
Code:
inline Foo operator + (const Foo& L, const Foo& R) {
    return std::move(Foo(L) += R);
}
3)
Code:
inline Foo operator + (const Foo& L, const Foo& R) {
    return std::move(Foo(std::move(L)) += R);
}
3)
Code:
inline Foo operator + (const Foo& L, const Foo& R) {
    return std::move(Foo(std::move(L)) += std::move(R));
}
Q) Doesn't the (1)'st version elide the copy (return value optimisation)? (Hence, copy constructor is called only once, right?)
Q) If so, why is it that (2) is faster than (1)? (Copy constructor is called only once, right?)
Q) Is (3) a correct thing to do?
Q) Is (4) a correct thing to do?