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