Cannot call find with haystack elements having a explicit copy constructors

RazvanN razvan.nitu1305 at gmail.com
Thu Jul 15 12:27:51 UTC 2021


On Thursday, 15 July 2021 at 11:08:25 UTC, Per Nordlöw wrote:
> The adding of copy construtors to `Service` defined as
>
> ```d
> @safe struct Service {
>     this(ref return scope typeof(this) rhs) {}
>     this(const ref return scope typeof(this) rhs) const {}
> }
>
> @safe struct Session {
>     void openAndGetService(in string key) scope {
>         import std.algorithm.searching : find;
>         auto hit = _pairs.find!((x) => x.key == key)();
>     }
>     private Pair[] _pairs;
>     private struct Pair {
>         string key;
>         Service service;
>     }
> }
> ```
>

struct Pair will have an inout(inout) copy constructor defined 
the following way:

     this(inout ref return scope typeof(this) rhs) inout
     {
         key = rhs.key;
         service = rhs.service;
     }

`service = rhs.service` will be rewritten to 
service.__cpctor(rhs.service), but since Service does not define 
an inout copy constructor it will fail to typecheck and the 
compiler will annotate it with @disable. Therefore, Pair will 
become uncopyable. This will result in isInputRange failing on 
Pair[] (more specifically, this constraints from isInputRange: 
is(typeof((return ref R r) => r.front)). If the copy constructor 
of Service is inout(inout), the generated copy constructor of 
Pair will be succesfully typechecked and everything will work.

For more context, please see this issue [1] and more 
specifically, this comment [2].

Cheers,
RazvanN

[1] https://issues.dlang.org/show_bug.cgi?id=20876
[2] https://issues.dlang.org/show_bug.cgi?id=20876#c4


More information about the Digitalmars-d-learn mailing list