Another way to describe my reasoning...

According to TDPL, if var is a variable of a user-defined type, then:
++var
gets rewritten as:
var.opUnary!"++"()

Thus, it would be very logical to assume that it doesn't matter whether you write:
++var
...or, write the following instead:
var.opUnary!"++"()
...because the second form is what the first form gets written to anyway.

But, that "very logical assumption" turns out to be wrong. Because in D, as it stands currently, it *does* make a difference whether you write it using the first form or the second:

struct S
{
    int _value;
}

ref S opUnary(string op : "++")(ref S s)
{
    ++s._value;
    return s;
}

Now, writing the following compiles and works:
S var;
var.opUnary!"++"();

...while the following doesn't compile:
S var;
++var;

This behavior of the language is not logical. And I don't think that logic is a matter of preference or taste.

Reply via email to