Как провести различие между перегрузкой двух версий оператора ++?
const T& operator ++(const T& rhs)
который один?
i++;
++i;
Ответ 1
Эти операторы унарные, т.е. они не принимают параметр правой руки.
Что касается вашего вопроса, если вы действительно должны перегружать эти операторы, для преинкремента используйте подпись const T& operator ++() и для постинкремента const T& operator(int). Параметр int является манекеном.
Ответ 2
Для версий, не являющихся членами, функция с одним параметром является префиксом, тогда как функция с двумя параметрами, а вторая - int является постфиксной:
struct X {};
X& operator++(X&); // prefix
X operator++(X&, int); // postfix
Для версий-членов версия с нулевым параметром является префиксом, а однопараметрическая версия, принимающая int, является постфиксной:
struct X {
X& operator++(); // prefix
X operator++(int); // postfix
};
Параметр int для вызовов операторов postfix будет иметь нулевое значение.
Ответ 3
для операторов postfix ++ и -, функция должна принимать аргумент int. если он не имеет аргумента, то он префиксный оператор
Ответ 4
Подумайте о приращении постфикса i++ как о наличии второго (отсутствующего) параметра (т.е. i++x). Поэтому postfix increment signature имеет правый параметр, а приращение префикса - нет.