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