Префикс и постфикс ++
- это разные операторы.Со стандартным объявлением стиля Foo operator symbol(Foo &)
не было никакого очевидного способа различить два.Вместо того, чтобы придумать какой-то новый синтаксис, такой как Foo symbol operator(Foo &)
, который превратил бы его в особый случай, в отличие от всех других операторов, и, вероятно, было бы немного трудно разобраться, разработчики языка хотели найти другое решение.
Решение, которое они выбрали, было несколько странным.Они отметили, что все остальные операторы «постфикса» (то есть операторы, которые возникли после одного из их операндов) были фактически инфиксными операторами, которые принимали два аргумента.Например, обычный старый +
, /
или >
.Исходя из этого, разработчики языка решили, что наличие случайного фиктивного аргумента будет хорошим способом отличить префикс от постфикса ++
.
ИМХО, это одно из странных решений, принятых по мере развития C ++.Но у вас это есть.
И вы не можете различить их по типу возвращаемого значения по двум причинам.
Во-первых, функции в C ++ не могут быть перегружены по типу возвращаемого значения.У вас не может быть двух функций с одинаковыми именами и списками типов параметров, но с разными возвращаемыми значениями.
Во-вторых, метод не будет надежным или достаточно гибким, чтобы обрабатывать все возможные реализации префикса и постфикса ++
.
Например, вам может потребоваться постфикс ++
, который возвращает ссылочный тип, если единственная причина, по которой вы когда-либо вызывали его, состояла в том, чтобы вызвать побочный эффект, не связанный со значением переменной, к которой вы его применяли.На мой взгляд, это было бы очень плохой реализацией, но C ++ не для оценки того, какой глупый код вы хотите написать, а для того, чтобы дать вам возможность написать любой код, который вы считаете подходящим для данной ситуации.И принуждение вас использовать один конкретный стиль типа возврата для префикса ++
и постфикса ++
противоречило бы этому духу.