I do not understand copy constructors

Paul Backus snarwin at gmail.com
Thu Aug 12 11:32:03 UTC 2021


On Thursday, 12 August 2021 at 11:19:34 UTC, drug wrote:
> ```D
> struct A {
>     int[] data;
>     this(ref return scope inout A rhs) /* no inout here */ { 
> data = rhs.data.dup; }
> }
> ```
> The problem is that if you qualify the ctor itself then if you 
> pass const/immutable rhs to it then the ctor is const/immutable 
> too (like the args) and of course you cannot modify this, so 
> the error.
>
> To make a copy ctor you need to qualify copy ctor args as inout 
> but the copy ctor itself shall be mutable and have no 
> const,immutable or inout qualifier.

This is not true. Qualifying the ctor as `inout` works fine: 
https://run.dlang.io/is/Kpzp5M

The problem in this example is that `.dup` always returns a 
mutable array, even if the array being copied is `inout`. The 
solution is to cast the copy back to the original type:

```d
this(ref return scope inout A rhs) inout
{
     data = cast(typeof(rhs.data)) rhs.data.dup;
}
```


More information about the Digitalmars-d-learn mailing list