On Saturday, 31 March 2018 at 23:38:06 UTC, Andrei Alexandrescu wrote:
[snip]

* immutable and const are very difficult, but we have an attack (assuming copy construction gets taken care of)


Would it be easier if the const/immutable containers were considered separate types? For instance, in the code below, there is InoutFoo and then Foo takes InoutFoo as an alias this (you could do the same thing with immutable, but then you’d have to include two get functions). This would be like inheriting the InoutFoo.

With better syntax, InoutFoo would be something like inout(Foo) and the compiler could recognize that the mutable constructor is also defined and to call that when appropriate.

struct InoutFoo
{
    int a;

    this(int b) inout
    {
        this.a = b;
    }

    int get() inout
    {
        return a;
    }
}

struct Foo
{
    InoutFoo inoutfoo;
    alias inoutfoo this;

    this(int b)
    {
        a = b;
    }

    void set(int b)
    {
        a = b;
    }
}


void main()
{
    auto x = immutable InoutFoo(1);
    auto y = Foo(1);

    assert(is(typeof(y) : typeof(x)));

    //x.a++; //not allowed
    y.a++;

    assert(x.a == 1);
    assert(y.a == 2);

    assert(x.get == 1);
    y.set(3);
    assert(y.get == 3);
}

Reply via email to