On Saturday, 8 March 2025 at 11:46:50 UTC, Anonymouse wrote:
    int[int] aa2;
    assert(0 !in aa2);
    modifyNoRef(aa2);
    assert(0 in aa2);

    int[int] aa3;
    const key = aa3.uniqueKey;
    assert(key in aa3); // <--
}

```

The `key in aa3` assert fails unless I make `uniqueKey` take its argument by ref. But `modifyNoRef` manages just fine without it. They work on the same type and they're all templates. The AAs they are passed have not been assigned any prior values.

What is the deciding difference between those two functions?

`assert(0 in aa2)` actually fails too.

When an AA is null, it must be passed by ref to modify it. Once it is non-null, its keys and values can be modified. But even a non-null AA cannot be reassigned by passing it without ref.

Note that an AA can be constructed using `new` before passing by value. See:
https://dlang.org/spec/hash-map.html#construction_and_ref_semantic

Reply via email to