++x returns a reference to the object you incremented, where as x++ returns a temporary copy of x‘s old value.
At least this would be the “normal” way by to implement these operators by convention. And all built-in types work this way. And if you’ve read about lvalues / rvalues then you would see that since the prefix operator returns the named object itself it would be an lvalue, where as the postfix operator returns a copy of a local temporary, which would then qualify as an rvalue.
Note: Also, we have prvalues, xvalues and such now, so it’s technically a bit more complicated these days. Look here for more info.