6 ms·
"But somehow a lot of people think it's OK to repurpose an operator to mean something completely different just because it's convenient. C++ being the classic e
by stelonix 14y ago
"But somehow a lot of people think it's OK to repurpose an operator to mean something completely different just because it's convenient. C++ being the classic example."
Do you have any data to prove such assertions? A C++ STL operator chosen more than a decade ago is not enough statistical data for one to have such a narrow-minded vision and say these bold statements. Maybe you need to check all the nice C++ libraries that make use of operator overloading.
- pjmlp 14y agoThe common example people pull off the hat with C++ is the use of << operator for streams and some UI toolkits. Which I personally never had a problem with.
- mikeash 14y agoYou seem to have confused the phrase "classic example" with "the worst thing out there, with data to prove it". It's an example. Do you dispute that? It's classic. That's subjective, and I claim it by raw assertion. That's it.
- tragomaskhalos 14y agoThere's basic language bigotry going on here: an aged internet meme declares that C++ operator overloading is bad because you can indeed, in theory, do idiotic counter-intuitive things with it. Yet the identical capability in Ruby, Scala and Haskell (inter alia) is deemed A Good Thing by the consensus.
- mikeash 14y agoFor me, and perhaps others, this is because C++ enshrines idiotic counter-intuitive operator overloading in its standard library.
- tragomaskhalos 14y agoExamples ?
- mikeash 14y agoThe use of << and >> for streams is the one that always comes to mind. So minor, and yet so awful.
- tragomaskhalos 14y agoWell this is clearly a matter of taste; the visual implication of movement (http://images.google.com/images?q=diversion+sign+chevrons http://images.google.com/images?q=diversion+sign+chevrons) is quite elegant IMHO, and the precedence seems natural also. But others' mileage obviously varies ...
- mikeash 14y agoI disagree that the precedence is natural. Without looking it up, and without compiling it, what do the following (IMO quite reasonable in general) lines of code do? cout << x & y; cout << (x & mask) != 0; cout << boolVar ? "Yes" : "No"; As for the visual implication of movement, I have no objection whatsoever to using the << operator for stream operations in general. However, I strenuously object to doing this in a language which already defines them as bitshift operators. Repurposing an operator to do something completely different (and especially in this case, where a functional operator suddenly turns into one that's almost entirely about causing a side effect) is bad. Operator overloading can be useful and result in great, comprehensible code, but only if operators only mean the same thing everywhere.
- tragomaskhalos 14y agoPoint taken, but small beer IMO; I use parens in boolean expressions because I can never remember the precedence of && vs ||, so would naturally use them here too. And I don't buy the fact that << is somehow off limits because it's used for bitshift; the domain of usage is usually disjoint, although one would have to squint to grok the outputting of a bitshifted value to a stream - but how frequent is that? Yes the << notation isn't perfect, but it is much nicer than named functions (and certainly superior to < (which Stroustrup initially considered)!). Adding arbitrary operators to the language would have required mechanisms to define associativity and precedence, which would have added a weight of complexity disproportionate to the reward.
- ethzero 14y agoIt's not an identical capability. Scala doesn't technically have operator overloading, it has symbolic method names and operator syntax for methods. This means you can use any valid name as an operator. With C++, you can only overload the built-in symbolic operators. This means instead of choosing the best symbolic name to use as an operator you're forced to re-purpose some built-in operator like "<<". In Scala you can pick any name or symbol you want.
- mercurial 14y agoSame with Haskell, which makes it compact but not always very readable (it effectively turns many libraries into their own non-intuitive DSL).
- tragomaskhalos 14y agoYes I know that, but the point is that the "operator overloading is terrible" complaint typically cites either plainly daft straw men like "what if someone overrides + to mean subtraction", or else hones in on << for streams, which as others have pointed out here is actually perfectly readable and sensible. I have yet to see a single sensible criticism that holds water (OK, MS overloading address-of & on a smart pointer, that one was stupid ..) Conversely, there was an XML library for Scala posted on Reddit about a year ago that used things like <:<, <<? and <> as method names; clearly the freedom to concoct your own symbolic names is far more open to abuse than the oft-maligned C++ mechanism.
- mikeash 14y agoTwo big problems with overloading << for streams are operator precedence (the precedence of << makes little sense for a stream operator) and the fact that the chained syntax can make the whole thing ambiguous (which is kind of a subset of the precedence problem), e.g.: cout << x << 3, does that shift x by 3, or output x and 3 separately?
- ScottBurson 14y agoI think it's an interesting phenomenon in the sociology of programming languages. A powerful new feature is introduced in a niche language, and novices abuse it. The feature gets a bad reputation. Yet eventually, as new languages adopt it, the community learns how to use it and how not to use it, and people become accustomed to it, and come to agree that it's not such a bad thing. I'd say that's happened, to some degree, with garbage collection and lambda expressions. We seem to be in the middle of the process with operator overloading, and still in the early stages with Lisp-style macros (I can hope, anyway :-).
- kzrdude 14y agoYou can't overload operators in Haskell. You can define new operators though. You're not going to change the meaning of + unless you remove the old.