operator++() is the preincrement operator (++x), while operator++(int) is the post increment operator (x++). If you understand how these operations work, then you should be able to explain why one of them must return a copy.
Take a simple example:
int x = 1; std::cout << x++ << "\n"; // prints 1 std::cout << ++x << "\n"; // prints 3
What happened to 2?
The value of x became 2 in the x++ expression, 1 was printed (the value of x prior to the increment operation). Because cout prints the value after the 'real' value was already incremented, it needs a temporary copy of that value.
In the second statement, the value of x becomes 3 in the ++x expression. Because the value has already been incremented, there is no need to copy it and can be used directly, and a reference is returned.
On simple, built in types like int this doesn't matter too much, but copy operations can become expensive when using large classes, especially with big collections.