Every ratified ANSI and ISO C++ standard, and every working draft, describes this, although the precise wording changes between versions.
For example, according to the "Working Draft, Standard for Programming Language C++", document number N4659, dated 2017-03-21, Section 16.5.7 "Increment and decrement [over.inc]", para 1
The user-defined function called operator++
implements the prefix and postfix ++
operator. If this function is a non-static member function with no parameters, or a non-member function with one parameter, it defines the prefix increment operator ++
for objects of that type. If the function is a non-static member function with one parameter (which shall be of type int) or a non-member function with two parameters (the second
of which shall be of type int), it defines the postfix increment operator ++
for objects of that type. When the postfix increment is called as a result of using the ++
operator, the int argument will have value zero.
At the end of the preceding para, there is a reference to footnote 134, which says
Calling operator++
explicitly, as in expressions like a.operator++(2)
, has no special properties: The argument to operator++
is 2
.
After para 1, the standard even provides an example.
[ Example:
struct X {
X& operator++(); // prefix ++a
X operator++(int); // postfix a++
};
struct Y { };
Y& operator++(Y&); // prefix ++b
Y operator++(Y&, int); // postfix b++
void f(X a, Y b) {
++a; // a.operator++();
a++; // a.operator++(0);
++b; // operator++(b);
b++; // operator++(b, 0);
a.operator++(); // explicit call: like ++a;
a.operator++(0); // explicit call: like a++;
operator++(b); // explicit call: like ++b;
operator++(b, 0); // explicit call: like b++;
}
— end example ]
Para 2 then goes on to say
The prefix and postfix decrement operators --
are handled analogously.