Modifying an associative array argument not passed by ref

Nick Treleaven nick at geany.org
Sat Mar 8 12:02:41 UTC 2025


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


More information about the Digitalmars-d-learn mailing list