The title says it all.
The first case f(const X&) is the good old fashioned const reference parameter.
However, when taking a mutable reference parameter, why not always use X&&? This way client code can use temps or regular lvalues, rather than f() dictating usage.
EDIT: Sloppiness on my part, sorry. I meant, given fc(const X&) and fm(X&&), do we need fm(X&)?
EDIT: Example: I use stateless decorators to pass as parameters:
class Base64Writer: public Writer {
public:
Base64Writer(Writer& w): w_(w) {}
private:
virtual void doWrite() override;
Writer& w_;
}
void func(Writer&& w) { w.doWrite(); }
// to be called as
Writer wr = ...;
func(Base64Writer(wr));