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