string and char[]

Steven Schveighoffer schveiguy at yahoo.com
Fri Apr 8 06:55:18 PDT 2011


On Fri, 08 Apr 2011 09:40:32 -0400, Denis Koroskin <2korden at gmail.com>  
wrote:

> On Fri, 08 Apr 2011 17:13:19 +0400, Steven Schveighoffer  
> <schveiguy at yahoo.com> wrote:
>
>> On Fri, 08 Apr 2011 06:44:42 -0400, Simen kjaeraas  
>> <simen.kjaras at gmail.com> wrote:
>>
>>> On Fri, 08 Apr 2011 12:46:08 +0200, Morlan <home at valentimex.com> wrote:
>>>
>>>> It is OK if I write
>>>>
>>>>   int[char[]] asr;
>>>>   asr["hello"] = 10;
>>>>
>>>> but the following does not compile:
>>>>
>>>>   char[] car = "hello";
>>>>
>>>> What is the explanation for this behaviour?
>>>
>>> The first should not be allowed. It is a mistake to use non-immutable
>>> keys for an associative array.
>>
>> int[char[]] asr;
>> pragma(msg, typeof(asr).stringof);
>>
>> outputs:
>>
>> AssociativeArray!(const(char)[],int)
>>
>> So the compiler adds const to the keys, which is why it works.
>>
>> Do I think this is the correct behavior?  Absolutely not.  First, it  
>> prevents nothing as far as modifying keys (const accepts mutable keys  
>> as well as const and mutable ones).  Second, I believe you should be  
>> able to use whatever key constancy you want.  We should just say if you  
>> do the wrong thing, it's undefined.  Maybe @safe code can only use  
>> immutable keys.  Third, if it must be illegal to have an AA with  
>> mutable keys, it should be an error, not silently change to const.
>>
>> -Steve
>
> What about storing objects as keys? There is nothing wrong to modify  
> those objects as long as their order stays the same.

I agree with you.  See my second point.  But even if that isn't what the  
committee decides, the current behavior guarantees absolutely nothing.

-Steve


More information about the Digitalmars-d mailing list