On 05.09.19 21:51, berni wrote:
void main()
{
    int[int] a;

    immutable int b = 17;
    a[1] = b;                          // <-- expecting error here
    const oldPointer = (1 in a);
    immutable int c = 10;
    a[1] = c;
    assert(oldPointer is (1 in a));

    Point[int] d;

    immutable Point e = Point(17);
    d[1] = e;                           // <-- but error is here
}

struct Point
{
    immutable int x;
}

What's the difference? I can put an immutable int in an AA and I can overwrite it (pointer is still the same),

You're not putting an immutable int into an AA. You're copying the value of an immutable int to a mutable one.

but I can't do that with a struct, having an immutable member. When I remove that immutable inside of the struct it works. ?!?

`Point` is effectively the same as `immutable long`. A better simile would be this: `immutable(int)[int] a; a[1] = 17;`. And now you get the same error. You can't overwrite the element, because its immutable.

You could argue that there is no element before assigning (initializing) `d[1]` for the first time. So the assignment should go through the first time, and it should only be an error when you try to write a second time. But figuring that out mechanically is hard, and DMD isn't smart enough to do it. So, to be on the safe side, it just says that you can't do that at all.

Reply via email to