I do not understand copy constructors
Learner
learner at gmail.com
Thu Aug 12 12:10:49 UTC 2021
On Thursday, 12 August 2021 at 11:32:03 UTC, Paul Backus wrote:
> 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;
> }
> ```
That worked fine, but the codebase is @safe:
```d
cast from `int[]` to `inout(int[])` not allowed in safe code
```
So copy constructors force me to introduce trusted methods, while
that was not necessary with postblits?
More information about the Digitalmars-d-learn
mailing list