AA char[] as key

Andrew Wiley wiley.andrew.j at gmail.com
Tue Jan 3 11:41:10 PST 2012

On Tue, Jan 3, 2012 at 1:25 PM, simendsjo <simendsjo at gmail.com> wrote:
> seems T[char[]] is rewritten as T[const(char)[]], and does not accept char[]
> as key even if mutable data should automatically convert to const (right..?)
> Shouldn't T[char[]] be disallowed, and have to be written as
> T[immutable(char)[]] instead of a silent rewrite?
>    alias long[char[]] AA;
>    // key automatically changed to const(char)[]
>    static assert(is(AA == long[const(char)[]]));
>    AA aa;
>    aa["a"] = 10;
>    // error - have to use immutable keys
>    aa["b".dup] = 11;

By design, the problem is things like this:

char[] key = "somekey";
long[char[]] aa;
aa[key] = 5;
key[2] = 'b';

If this were allowed, the associative array would reach an invalid
state where the hash it stored for the key is no longer correct.

It does seem like T[char[]] should be disallowed and the requirement
for immutable keys should be literally enforced, and it's possible
that was intended but immutable/const weren't as complete when this
problem was last visited. I'll see if I can dig up an old discussion
about this.

More information about the Digitalmars-d-learn mailing list