AA char[] as key

simendsjo simendsjo at gmail.com
Tue Jan 3 11:50:07 PST 2012


On 03.01.2012 20:41, Andrew Wiley wrote:
> 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.

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.


More information about the Digitalmars-d-learn mailing list