You should do "pass by value and then move construct" if your type's move constructor is cheap, and use "Pass by reference and then copy construct" otherwise.
For lvalues
Pass by value and then move construct
You will be doing one copy followed by one move.
Pass by reference and then copy construct
You will be doing one copy
For Rvalues
Pass by value and then move construct
In the best case (when the rvalue is a temporary expression) you will be doing no copy/no move, followed by a move.
In the normal case (when the rvalue is not a temporary expression) you will be doing a move followed by another move.
Pass by reference and then copy construct
You will be doing one copy