On Tuesday, 14 November 2023 at 08:50:34 UTC, dhs wrote:
```d
struct S2
{
    this(ref inout S2 s) inout { writeln("copy"); }
    int i;
}

void test()
{
    const(S1) s1;
    S1 ss1 = s1; // error, ss1 not qualified as const

    const(S2) s2;
    S2 ss2 = s2; // fine, why?
}
```

Isn't "inout" supposed to copy the const-ness of its parameter to the constructor's attribute? In other words: why doesn't ss2=s2 fail here?

Because `S2` is a pure value type and contains no pointers or references, the compiler allows `const(S2)` to implicitly convert to `S2`. This is documented in the spec under ["Implicit Qualifier Conversions"][1], and you can verify it with a `static assert`:

```d
static assert(is(const(S2) : S2)); // ok
```

In order to prevent this conversion, you can replace `int i` with `int* p`:

```d
struct S3
{
    this(ref inout S2 s) inout { writeln("copy"); }
    int *p;
}

void test()
{
    const(S3) s3;
    S3 ss3 = s3;
    // Error: cannot implicitly convert expression
    // `s3` of type `const(S3)` to `S3`
}
```

[1]: https://dlang.org/spec/const3.html#implicit_qualifier_conversions

Reply via email to