The const modifier on the return value is not necessary and can hinder move semantics. The preferred way of preventing assignment to rvalues in C++11 is to use "ref-qualifiers."
struct Rational
{
Rational & operator=( Rational other ) &; // can only be called on lvalues
};
Rational operator*( Rational const & lhs, Rational const & rhs );
Rational a, b, c;
(a * b) = c; // error