On 07/29/2017 10:15 PM, Matthew Gamble wrote:

>> I think it should work. I think a cast to unqualified is a safe
>> workaround in this case:
>>
>>     auto pairs() @property const { return
>> (cast(int[string])aa).byPair.array.sort().release; }

As your question reveals, casting away const is not safe in general and not for this code. :-/

> That works to solve the compile problem. Seems the data in aa was safe
> from modification without the const or casting, even if the values are
> reference types (i.e. ClassB[string]). Is that expected?

No, they are not safe as you can mutate values in the AA:

import std.stdio;
import std.array;
import std.algorithm;

class B {
    int i;
    void mutate() {
        ++i;
    }
}

class A
{
    this() { aa = ["a" : new B(), "b" : new B(), "c" : new B()]; }
auto pairs() @property const { return (cast(B[string])aa).byPair.array.sort().release; }
private:
    B[string] aa;
}

void main() {
    auto a = new A();
    auto p = a.pairs();
    p.front[1].mutate();
    assert(p.front[1].i == 1);    // <-- Mutated :(
}

Of course, the problem is the same without const and the cast.

Ali

Reply via email to