C ++ herda operadores azuis verdadeiros de C. Com isso, quero dizer que o "+" em 6 + 4 é muito especial. Você não pode, por exemplo, obter um ponteiro para essa função +.
Scala, por outro lado, não tem operadores dessa maneira. Ele possui grande flexibilidade na definição de nomes de métodos, além de um pouco de precedência incorporada para símbolos que não são de palavras. Portanto, tecnicamente, o Scala não possui sobrecarga de operador.
Como você quiser chamá-lo, a sobrecarga do operador não é inerentemente ruim, mesmo em C ++. O problema é quando maus programadores abusam dele. Mas, francamente, sou da opinião de que tirar a capacidade dos programadores de abusar da sobrecarga do operador não prejudica a correção de tudo o que os programadores podem abusar. A verdadeira resposta é orientação. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Não obstante, existem diferenças entre a sobrecarga de operadores do C ++ e a nomeação flexível de métodos do Scala que, IMHO, tornam o Scala menos abusivo e mais abusivo.
No C ++, a única maneira de obter a notação de correção é usando operadores. Caso contrário, você deve usar object.message (argumento) ou ponteiro-> messsage (argumento) ou função (argumento1, argumento2). Portanto, se você deseja um determinado estilo DSLish no seu código, há pressão para usar operadores.
No Scala, você pode obter notação infix com qualquer mensagem enviada. "argumento de mensagem de objeto" está perfeitamente correto, o que significa que você não precisa usar símbolos que não sejam de palavras apenas para obter notação infix.
A sobrecarga do operador C ++ é limitada essencialmente aos operadores C. Combinado com a limitação de que apenas operadores podem ser usados infixos que pressionam as pessoas a tentar mapear uma ampla gama de conceitos não relacionados em relativamente poucos símbolos como "+" e ">>"
O Scala permite uma grande variedade de símbolos válidos que não sejam palavras como nomes de métodos. Por exemplo, eu tenho um DSL Prolog-ish incorporado onde você pode escrever
female('jane)! // jane is female
parent('jane,'john)! // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent
mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female
mother('X, 'john)? // find john's mother
mother('jane, 'X)? // find's all of jane's children
Os símbolos: -,!,? E & são definidos como métodos comuns. Somente em C ++ e seria válido, portanto, uma tentativa de mapear esse DSL em C ++ exigiria alguns símbolos que já evocam conceitos muito diferentes.
Claro, isso também abre Scala para outro tipo de abuso. No Scala, você pode nomear um método como $! & ^%, Se desejar.
Para outras linguagens que, como Scala, são flexíveis no uso de nomes de funções e métodos que não sejam palavras, consulte Smalltalk, onde, como Scala, todo "operador" é apenas outro método e Haskell, que permite ao programador definir precedência e fixidez de nomes flexíveis. funções.