In D associative array have reference semantic. Well they do, except when they are initially created, in which case they are null. For instance:
int[int] a1;
int[int] a2 = a1; // a1 is null, so a2 is null too.
a2[3] = 3; // a2 is initialized to something else than null here.
writeln(a1.length); // prints 0.
a1 = a2; // a1 and a2 now point to the same reference.
a2[4] = 4;
writeln(a1.length); // prints 2. a1 was modified with a2 now that they point to the same thing.
There is an immediate problem with this: how does one gets an empty, but non null, associative array?
I find myself in a situation where I use an AA to cache some computation results, and this cache might be necessary in a couple of places in the application. It works great, unless the cache is initially empty, in which case, every location ends up with its own cache, defeating the whole point of caching these results to begin with.