A opIndexUnary quiz

monarch_dodra monarchdodra at gmail.com
Tue Jan 1 13:19:03 PST 2013


On Tuesday, 1 January 2013 at 17:52:20 UTC, bearophile wrote:
> A small quiz (it's a reprise of an older discussion). This code 
> compiles with no errors, but do you see anything wrong here?
>
>
> // -----------------
> struct Foo {
>     int x;
>     alias this = x;
> }
>
> class Bar {
>     Foo[] data;
>
>     this() {
>         data.length = 10;
>     }
>
>     Foo opIndex(uint i) {
>         return data[i];
>     }
>
>     void opIndexUnary(string op)(uint i) if (op == "++") {
>         data[i]++;
>     }
>
>     void opIndexUnaryRight(string op)(uint i) if (op == "++") {
>         data[i]++;
>     }
> }
>
> void main() {
>     auto barfoo = new Bar;
>     ++barfoo[3];
>     assert(barfoo.data[3] == 1);
>     barfoo[3]++;
>     assert(barfoo.data[3] == 2);
> }
> // -----------------
>
>
> Do you think this code should produce some compilation errors?
>
> Bye,
> bearophile

YES. Or should I say: There needs to be a way to diagnose these 
kinds of errors. I think there should be a "operator" keyword to 
protect yourself. I'd prefer it be mandatory, but even 
introducing it as optional would help:

//----
operator void opIndexUnaryRight(string op)(uint i);
//----
Error: No operator opIndexUnaryRight. Perhaps you meant 
opIndexUnary?
//----

This is especially improtant in that sometimes, the operator name 
is a guessing game...

==========================================
Related: I fixed a similar bug in std.container.DList recently: 
Can you spot the error?

//----
DList opOpassign(string op, Stuff)(Stuff rhs)  	
if (op == "~" && is(Stuff == DList))
//----

The fact that it made it into the standard library is, IMO, a 
tell tale sign of a big problem. A "smoking gun".


More information about the Digitalmars-d-learn mailing list