In general, I can’t think of a reasonable use case where there will be a difference, but I think that you could find a case where the operation has different implementations for rvalue references and rvalues, and language rules do not dictate that the return type of various overloads should be the same (even if common sense defines it).
Thus, in the general case there will be no difference, and in case there are differences, well, these cases need special care and attention to much worse problems than the template itself ...
// sick corner case: struct type {}; int operator+( type&& lhs, type&& rhs ); double operator+( type const & lhs, type const & rhs );
I can think of situations where you would like to offer different overloads for rvalue links (consider some implementation of the list that operator+ offers as concatenation, then overloading with rvalue links can avoid the cost of copying by simply manipulating the pointers and leaving the argument lists empty) , but it would be completely confusing if the type of the result would depend on the l / rvalue-ness arguments.
source share