On Monday, 18 December 2023 at 14:38:14 UTC, Ki Rill wrote:
your code just return result value,
but it should not return but save result to "this"
see example at https://dlang.org/spec/operatoroverloading.html#index_op_assignment

I get an error, but don't understand why.
```d
auto opOpAssign(string op)(Value rhs)
{
    this = this + rhs;
    return this;
}

// Error: `this` is not an lvalue and cannot be modified
```

Assigning an object is like copying a pointer. You may think you can try overloading the assignment, but it is [forbidden](https://dlang.org/spec/operatoroverloading.html#assignment):

```
However for class types, identity assignment is not allowed. All class types have reference semantics, so identity assignment by default rebinds the left-hand-side to the argument at the right, and this is not overridable.
```

But you aren't trying to do this.

Instead you are trying to reassign the `this` reference, which is a local (and also forbidden). Think about it a second, your `this + rhs` is going to allocate a *new* object. Then if the assignment to the local `this` parameter succeeded, what happens outside the member function? The true reference that is calling this will not be updated!

The only way to do this I can see is to reimplement for op=, or maybe perform the operation and swap the guts out.

-Steve

Reply via email to