C ++ eredita i veri operatori blu da C. Con questo intendo che il "+" in 6 + 4 è molto speciale. Ad esempio, non puoi ottenere un puntatore a quella + funzione.
Scala invece non ha operatori in quel modo. Ha solo una grande flessibilità nella definizione dei nomi dei metodi più un po 'di precedenza incorporata per i simboli non di parole. Quindi tecnicamente Scala non ha sovraccarico dell'operatore.
Qualunque cosa tu voglia chiamarlo, il sovraccarico dell'operatore non è intrinsecamente negativo, anche in C ++. Il problema è quando i cattivi programmatori lo abusano. Ma francamente, sono dell'opinione che togliere la capacità dei programmatori di abusare del sovraccarico dell'operatore non metta una goccia nel secchio di sistemare tutto ciò che i programmatori possono abusare. La vera risposta è il mentoring. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Tuttavia, ci sono differenze tra il sovraccarico dell'operatore di C ++ e la flessibile denominazione del metodo di Scala che, IMHO, rende Scala meno abusabile e più abusabile.
In C ++ l'unico modo per ottenere la notazione in-fix è usare gli operatori. Altrimenti è necessario utilizzare object.message (argomento) o pointer-> messsage (argomento) o funzione (argomento1, argomento2). Quindi, se vuoi un certo stile DSLish nel tuo codice, allora c'è la pressione di usare gli operatori.
In Scala è possibile ottenere notazioni infissi con qualsiasi messaggio inviato. "argomento messaggio oggetto" è perfettamente ok, il che significa che non è necessario utilizzare simboli non di parole solo per ottenere la notazione infix.
Il sovraccarico dell'operatore C ++ è limitato essenzialmente agli operatori C. In combinazione con la limitazione che solo gli operatori possono essere utilizzati, infissi che fanno pressione sulle persone per provare a mappare una vasta gamma di concetti non correlati su relativamente pochi simboli come "+" e ">>"
Scala consente una vasta gamma di simboli non di parole validi come nomi di metodi. Ad esempio, ho un DSL Prolog-ish incorporato in cui è possibile scrivere
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
I simboli: -,!,? E & sono definiti come metodi ordinari. Solo in C ++ e sarebbe valido, quindi un tentativo di mappare questo DSL in C ++ richiederebbe alcuni simboli che già evocano concetti molto diversi.
Naturalmente, questo apre anche Scala a un altro tipo di abuso. In Scala puoi nominare un metodo $! & ^% Se vuoi.
Per altre lingue che, come Scala, sono flessibili nell'uso della funzione non-parola e dei nomi dei metodi, vedere Smalltalk dove, come Scala, ogni "operatore" è solo un altro metodo e Haskell che consente al programmatore di definire la precedenza e la fissità di nomi flessibili funzioni.