Você está lutando contra duas coisas aqui:
- Por que os operadores existem em idiomas em primeiro lugar?
- Qual é a virtude dos operadores sobre funções / métodos?
Na maioria das linguagens, os operadores não são realmente implementados como funções simples. Eles podem ter alguma função de scaffolding, mas o compilador / tempo de execução é explicitamente ciente de seu significado semântico e como traduzi-los eficientemente em código de máquina. Isso é muito mais verdadeiro, mesmo quando comparado às funções internas (e é por isso que a maioria das implementações também não inclui toda a sobrecarga da chamada de função em sua implementação). A maioria dos operadores são abstrações de nível superior em instruções primitivas encontradas em CPUs (o que é em parte o motivo pelo qual a maioria dos operadores é aritmética, booleana ou bit a bit). Você poderia modelá-las como funções "especiais" (chamá-las de "primitivas" ou "builtins" ou "nativas" ou qualquer outra), mas fazer isso genericamente requer um conjunto muito robusto de semânticas para definir essas funções especiais. A alternativa é ter operadores integrados que se parecem semanticamente com operadores definidos pelo usuário, mas que, de outra forma, invocam caminhos especiais no compilador. Isso entra em conflito com a resposta à segunda questão ...
Além do problema de tradução automática mencionado acima, em um nível sintático, os operadores não são realmente diferentes das funções. Eles são características distintivas que tendem a ser que eles são concisos e simbólicos, o que sugere uma característica adicional significativa que deve ter para ser útil: eles devem ter significado / semântica amplamente compreendido para os desenvolvedores. Símbolos curtos não transmitem muito significado a menos que seja curto para um conjunto de semânticas que já são compreendidas. Isso torna os operadores definidos pelo usuário inerentemente inúteis, pois, por sua própria natureza, eles não são tão amplamente compreendidos. Eles fazem tanto sentido quanto nomes de função de uma ou duas letras.
As sobrecargas do operador do C ++ fornecem um terreno fértil para examinar isso. A maioria dos "abusos" de sobrecarga do operador vem na forma de sobrecargas que quebram alguns dos contratos semânticos que são amplamente compreendidos (um exemplo clássico é uma sobrecarga do operador + tal que a + b! = B + a, ou onde + modifica qualquer um dos seus operandos).
Se você olhar para o Smalltalk, que permite a sobrecarga do operador e operadores definidos pelo usuário, você pode ver como uma linguagem pode ser usada e quão útil seria. Em Smalltalk, os operadores são meramente métodos com propriedades sintáticas diferentes (a saber, eles são codificados como binários infix). A linguagem usa "métodos primitivos" para operadores e métodos acelerados especiais. Você descobre que poucos operadores, se definidos pelo usuário, são criados e, quando o são, tendem a não se acostumar tanto quanto o autor provavelmente pretendia que fossem usados. Mesmo o equivalente de uma sobrecarga de operador é raro, porque é principalmente uma perda de rede para definir uma nova função como um operador em vez de um método, pois o último permite uma expressão da semântica da função.