On Fri, 08 Apr 2011 17:13:19 +0400, Steven Schveighoffer <[email protected]> wrote:

On Fri, 08 Apr 2011 06:44:42 -0400, Simen kjaeraas <[email protected]> wrote:

On Fri, 08 Apr 2011 12:46:08 +0200, Morlan <[email protected]> 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. Immutable works, but that's an overkill, tail const would suffice in most cases (where an indirection isn't used). E.g.:

int[void*] example;

All that is required is that "int compare(T)(T lhs, T rhs)" is pure (i.e. returns same result for same inputs).

In future, compiler could statically enforce that

int compare(void* lhs, void* rhs) pure
{
    if (lhs < rhs) return 1;
    if (lhs > rhs) return -1;
    return 0;
}

is correct and

int compare(char[] lhs, char[] rhs) pure
{
    if (lhs < rhs) return 1;
    if (lhs > rhs) return -1;
    return 0;
}

is not.

For some reason (bug?), both compile with 2.052.

Reply via email to