Каким образом компилятор понимает что вызывается постфиксная версия инкремента?

Каким образом компилятор понимает что вызывается постфиксная версия инкремента, если явно правый параметр не передается?

class Number {
    int _number;
public:
    Number(int number) : _number(number) {}

    Number operator++(int);
};

Number Number::operator++(int) {
    Number s(_number);
    
    ++_number;
    return s;
}

int main() {
    Number(1)++;
}

Ответы (1 шт):

Автор решения: DmitryK

Ну вы сами в коде в коде пишете, какой инкремент вызвать.

Number s(10);
s++; // вызвать постфиксный
++s; // вызвать префиксный

При перегрузке:
C++ использует «фиктивный аргумент» для постфиксных операторов. Этот аргумент никак внутри не используется и служит только для того, чтобы отличить постфиксную версию инкремента/декремента от префиксной версии.

class Number 
{
public:
    Number& operator++(); // префиксный
    Number  operator++(int); // постфиксный
};

В префиксной версии обычно возвращается ссылка на самого себя, а в постфиксной - копия объекта. Поэтому в общем случае префиксная версия работает быстрее постфиксной.

→ Ссылка