On Tuesday, 14 November 2023 at 08:50:34 UTC, dhs wrote:

I am using following code:

```d
struct S1
{
    this(ref const S1 s) const { writeln("copy"); }
    int i;
}

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?


`ss2 = s2` does not fail because the type is implicitly convertible to non-const (a const int can be converted to a mutable int). Change `i` to `int *` and it will fail.

IMO, the first should succeed as well. And I will note that the error looks different from what you say:

```
Error: copy constructor `testinoutctor.S1.this(ref const(S1) s) const` is not callable using argument types `(const(S1))`
```

I'm not sure what this means. There shouldn't be a copy being made here, as the thing is already const. I don't understand this error, and it looks like a bug to me.

-Steve

Reply via email to