On 03.01.2012 20:41, Andrew Wiley wrote:
On Tue, Jan 3, 2012 at 1:25 PM, simendsjo<[email protected]>  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.

It is disallowed, but it's enforced when setting a key rather than when constructing the type.
So `aa[key] = 5` above fails as key is char[] rather than string.

Reply via email to