On Tuesday, 14 November 2023 at 14:58:21 UTC, Paul Backus wrote:

```d
struct S2
{
    int* p;
    this(const int* p) const
    {
        // Ok - counts as initialization
        this.p = p;
    }
}

immutable int answer = 42;

void main()
{
    S2 s2;
    // If this were allowed to compile...
    s2.__ctor(&answer);
    // ...then this could happen
    *s2.p = 12345;
}
```

Thanks for this explanation, it all makes perfect sense.

Regarding implicit qualifier conversion: in my code, S2 has a copy constructor, so it takes a "ref inout S2" as input. Since the copy constructor is in itself qualified as inout, the implicit "this" parameter is "ref inout S2" too.

We then have "const(S2) s2;" and "S2 ss2 = s2;". The implicit qualifier conversions *for references* do not allow conversion from "ref const(S2)" to "ref S2", so I assume that the "inout" in the copy constructor translates to "const". In that case, the copy constructor creates a "const S2", not an S2.

Does this "const S2" then get implicitly converted to "S2", before being assigned to "ss2"? I tried adding an opAssign() to S2 - it's not getting called. So I'm not sure what is actually going on here.

Reply via email to