The section on opIndex and opIndexAssign states that op=, ++, and -- operators can't be supported.
However, if we have:
struct S {
ref <type> opIndex(size_t idx) {...}
}
then, the following code will do what we expect
S s;
s[i] += 4;
as the += ends up calling opIndex. At least, this is what dmd 2.026 appears to do. If the docs are adjusted accordingly, then that wart is removed.
As a side note, opIndexAssign doesn't appear necessary at all if we do things this way. As long as opIndex is declared with ref, it can be used as lvalue and rvalue.
Comment #1 by smjg — 2009-03-20T20:10:32Z
opIndexAssign will always be needed for something. Library implementations of AAs and bit arrays are an example.
There should be probably be a choice of defining opIndexAssign or defining opIndex with a ref return. opIndexAssign could even work for the example code, if s[i] += 4 were rewritten as s[i] = s[i] + 4 (with i being evaluated only once) and then expanded into op functions.
The tricky bit is deciding on the logic to use if both are defined....